@מנחם בכלל? כי הם ממש מזרזים להירשם.
החשש היותר גדול שלי זה שתתמלא הכיתה.

clickone
-
רישום לצהרונים של פתחיה נכשל - יש למישהו מידע? -
רישום לצהרונים של פתחיה נכשל - יש למישהו מידע?אני מנסה לרשום את הילדה שלי לצהרון פתחיה, משום מה הוא באתר לפני המעבר לתשלום הוא מוציא שגיאה "לא נמצא מחיר לתשלום, נא לפנות למשרד"
בטלפון לאחר הקלדת הסמל השיחה פשוט נופלת לפני המעבר לתשלום.
(אני משער שבשניהם זה בגלל אותה הסיבה)שלחתי לפתחיה פנייה דרך הצור קשר באתר כבר מהצהריים ואין תגובה (אולי חופש?)
החשש שלי הוא שזמן הרישום מוגבל ושלא תתמלא הכיתה (למרות שייתכן שלכאורה לכולם יש את הבעיה הזו)מישהו נתקל בזה?
או למישהו יש רעיון נוסף איך לפנות אליהם?
(האמת יש גם מצב לא קטן שהמתכנת שלהם אולי מסתובב כאן...)תודה
-
מהירות הזנת נתונים בdb בהרבה רשומות@chagold
זה היה הכנסה לטבלה בצורה נקיה נטו?
או שבדקת לדוגמא שהרשומה לא נמצאת כבר. (אם זה המצב אז זה הגיוני שככל שיהיו יותר נתונים לבדיקה יקח יותר זמן)יש אינדקסים מורכבים בטבלה? (גם גורם לפעמים להאטה בהכנסה)
-
הצעה לפתרון למכת הצינתוקים@nigun
ככל שהשיחות מגיעות אליך כחברה, אתה יכול לזהות באופן אוטומטי תעועה שמגיעה כגל מחברה מסויימת, ללא קשר למספר המזוהה שלה (ואז הם ישלחו את השיחות בהבדל רנדומליולא עשינו כלום...)
המודל שהצגת יכול להיות רעיון מצויין. חלקו כבר ממומש היום במרכזיות.הבעיה בלמכור כזה שירות לחברה מבחוץ שזה לא כזה פשוט להטמיע כזה דבר בחברה קיימת, כי זה לא עובד שם עם מרכזיות קלאסיות. (לא אומר שזה אפשרי, אבל זה הרבה יותר מורכב)
ולכן הפיתרון הנכון הוא לייצא X סימים שלך שנמצאים מול המרכזיה שלך (גילוי נאות התחלתי בעבר לשבת על זה, ממתין כעת לאחד הספקים שלי), בכל מקרה הבעיה בזה היא המחיר שזה יעלה ללקוח הקצה.
אני חושב שברגע שהקש"ג יירד, + הרפורמה הנוכחית של משרד התקשורת למפעילים, תהיה אפשרות לא מסובכת להפוך לMVNO שמספק כאלו שירותים בלי יותר מדאי בלגן, ואז אולי יותר פשוט.ואל תשכח שרגע אחרי שיוצא כזה מוצר לשוק עם כל ההשקעה זה יוצא אצל המתחרים...
כמו שכתב @by6199 גם אני ראיתי פירסום של חברת סים כשר שיש להם כזה שירות, אז שווה לבדוק אצלו קודם.
-
דוח נוכחות באקסס@OdedDvir
בגלל שהמפריד הוא טאב ולא פסיק, אז האקסל לא יודע לזהות את זה אוטומטית.
אפשר או לפתוח אקסל/אקסס ולייבא את הקובץ ולומר לו מפורש שהמפריד הוא טאב,או לחילופין לפתוח את הקובץ בעורך טקסט ולהוסיף בשורה הראשונה (הטריק הזה לא עוזר ולא נצרך באקסס)
sep=
אחרי השווה לשים טאב
קרדיט לידידנו @שואף שלימד אותי את הטריק הזה.משהו נוסף, באקסס צריך בייבוא של הקובץ הזה להגדיר קידוד עברית ווינדוס
-
העתקת כתובות מייל@A0533057932 צודק. זה צריך להיות באנשי קשר נוספים
אח"כ לסמן את אחד מהם בV
ואז לעלות למעלה ולסמן הכל
ללחוץ על ה3 נקודות ואז ייצוא -
העתקת כתובות מייל -
המלצה על SERENITY או דומיו במקום אקסס@Y-Excel-Access אחרי התגובות של 2 התותחים דכאן ( @dovid + @OdedDvir ), אני מרשה לעצמי לכתוב גם כמה מילים, אני מניח שבחלק מהדברים אני אחזור על הדברים שכבר כתבו, אבל כאחד שעבר (ועובר בכל יום מחדש) את התהליך, אנסה לתת זווית נוספת. (האמת שאני חושש שיצא קצת מבולבל וארוך, אבל אשתדל שייצא ברור)
להבנתי הגעת למדריך של סרניטי מפוסט שאני כתבתי. אכן סרניטי הדהימה אותי בהתחלה עם מחשבה שזה באמת כלי נפלא של הגירה למשתמשי אקסס.
ייתכן שהיא באמת כזו, אבל די התייאשתי איתה, בגלל שהרבה דברים היו שם שבלוניים.הרעיון של סרניטי במילה אחת, הוא תיכנות הצהרתי.
כלומר, אתה תגיד מה אתה רוצה שיקרה + תן את המודולים של הטבלאות וכו', והתבנית תבנה את כל מה שאתה רוצה כמעט מאפס בקלות.אחד האתגרים הגדולים של מתכנתי אקסס (וככל שהם כתבו יותר קוד הבעיה רק הולכת וגדלה), זה הפשטות של אקסס לעשות דברים, בעיקר בעניין של תגובה לאירועים + ריענון המסך בפשטות.
יש עוד אלמנט שלדעתי בו אקסס ממש מאד חזקה, וזה מהווה קושי מאד גדול בהגירה, זה הפשטות של תיבות רשימה שנפתחות, ואז בשניה אחת קוד שבסך הכל עושה requery שזה אומר תרענן לי את הפקד ההוא על סמך הערך הנבחר.
בנוסף, אחד הקשיים זה נקודת האבטחה, אם באקסס אתה יכול לפעמים לסמוך על זה שהסתרת פקד אז 99.9 שלא תהיה גישה אליו, בווב זה ממש לא ככה.ואז מגיע האתגר הגדול, שאנחנו מנסים לקחת את התפיסה של אקסס, לעולם של הווב, (ממש ליישם את כל התפיסה עצמה) בלי להבין שיש כאן תפיסה חדשה לחלוטין.
[כמובן שאתה יכול להחליט שאתה עובד על WinForms אבל אישית אני חושב שלא כדאי. אם אתה מתחיל ללמוד, לך ישר על ווב (אגב בעבר היה לי קוד VBA שידע לקחת פרוייקט ולהמיר אותו כולל טפסים לwinforms אבל זה לא עשה את העבודה עד הסוף ובסוף התייאשתי...)]
אז מה כן?
אני אגיד לך את האמת, שעד היום אני לא יודע מה נכוןאבל אני אגיד מה אפשר.
-
אם יש לך המון זמן פנוי (אני מניח שלא, וזה חלק מהבעיה של כולם), לך ללמוד פריימוורק כמו אנגולר / VUE /ריאקט וכו'.
לגבי התצוגה שתיראה יפה עם דשבורד וכו, אין לך לדעתי מה לדאוג בכלל, כי אחרי שתיכנס לבסיס, תגלה שיש ים תבניות באינטרנט בחינם / בעלות מאד זולה של כמה עשרות דולרים, כולל RTL והמון פקדים שכבר מוכנים.
ולכן אני חושב שמה שהכי פחות אתה הכי צריך להיות מודאג זה היופי איך שזה ייראה. -
אם אין לך הרבה זמן פנוי, (בעיקר לא כדי להתחיל ללמוד פריימוורקים חדשים עם עקומת למידה וכו') אבל מצד שני אתה רוצה פיתרון די מהיר, ואתה מתמודד טוב עם C# לדוגמא (גם אם לא יש כאן הרבה שישמחו לעזור), ואתה עדיין רוצה ללכת על ווב, ואני מניח שמה שמעניין אותך זה בעיקר CURD, (כמה הנחות יסוד... אני מקווה שלא פיפספתי אותך במשהו), אז הייתי מציע לך לשקול את בלייזור + GridMvc.
במיני מחקר שעשיתי (בעיקר על עצמי אבל על עוד מתכנתי אקסס) יצא לי שאנחנו מפחדים משום מה מJS בצד הלקוח, אבל לכתוב קוד C# בצד לקוח משום מה זה פחות מרתיע (לא יודע למה...), ולכן, בשילוב של שני האלמנטים האלו, אתה יכול לקבל מערכת שנראית "בסדר" (לפחות להתחלה) + מערכת ניהול משתמשים די טובה, + יכולת ניהול טבלה עם חיפוש + עריכה + מחיקה וכו.
ההגדרה של טבלת רשימה בGRID שהבאתי די פשוטה וקלילה, אני משתמש באובייקט דומה שלהם לMVC רגיל ומאד מרוצה.
בפרוייקט הזה הם עשו את זה אפילו יותר פשוט וזריז.
מה שקצת מלחיץ בבלייזור, זה שמייקרוסופט לא תנטוש אותו פתאם כמו שהיא נוהגת לעשות לפעמים.
סליחה על האריכות,
לא הצלחתי לכתוב כל מה שרציתי, ואני חושש שיותר עשיתי בלגן מאשר סדר. -
-
SQL שאילתה תקועה... מה כן אפשר?@ש-ב-ח אמר בSQL שאילתה תקועה... מה כן אפשר?:
נוסה, חזר אחרי 300ms
אז מה מפריע לך להשתמש בJOIN במקום שאילתת משנה? זה די מהיר לפי איך שאתה מתאר....
@שמואל4 אמר בSQL שאילתה תקועה... מה כן אפשר?:
צריך לקחת בחשבון שהוספת אינדקס לטבלא בשימוש בעיקר כזו גדולה יכולה לקחת הרבה זמן - וזה כולל נעילה של הטבלא.
צודק לגמרי.
בכל מקרה אצלי באחד הפרוייקטים, באחת הטבלאות, עם כ50 מליון שורות, יש אינדקסים ובינתיים ב"ה עובד די טוב ומהיר. (האמת שאצלי זה MSSQL, וכאן נראה שזה MYSQL, אבל לדעתי לא אמורים להיות הבדלים משמעותיים)
שווה בכל מקרה לנסות.
ייתכן אם זה אפשרי שלפחות את הגדרת האינדקס הראשוני לא כדאי לעשות כשהDB בפרודקשיין. -
SQL שאילתה תקועה... מה כן אפשר?@ש-ב-ח הקטע השני שהוצאת, והוצאתו גורמת לשאילתא לרוץ מהר, הוא בעצם שאילתת משנה, שגורמת לו לחפש על כל רשומה את ההתניה בטבלה meta_records, וזה הגיוני שלוקח לו זמן. (בעיקר אם יש בmeta_records הרבה רשומות)
פתרונות אפשריים:
- לשים אינדקס בטבלה meta_records על השדות שאתה מפלטר, עדיף אינדקס אחד על כל 3 השדות ביחד.
- אם אתה מסנן בטבלת המשנה משהו קבוע, אז להוסיף עמודה בטבלה הראשית שתכיל כן/לא, ופשוט לעדכן את זה בשעת ההכנסה של הנתונים.
אני מדגיש שהשיטה הזו לא נכונה מבחינת תיכנון נכון של DB (אחת הסיבות כי אתה יכול לחשב את זה, ואסור עקרונית לשמור נתון סטטי כשאתה יכול לחשב אותו), אבל במקרה של בעית ביצועים כזו אני אישית מאד בעד לשמור גם את הנתון סטטי ברשומה עצמה, ולא לחשב אותה כל פעם מחדש. - אפשרות נוספת ששווה לבדוק (לא בטוח שזה אפשרי, אבל תנסה), זה לא לשים את החיפוש של הטבלה השניה כשאילתת משנה, אלא לחבר אותה כJOIN, ואז לסנן את כל מה שמתאים (ממילא אתה מחפש את מה שקיים ולא מה שחסר, כך שלכאורה ייתכן שאתה יכול להשתמש אפילו בINNER JOIN בלב שלם)
-
עזרה בזיהוי פורמט טלפוניה בלתי מוכר לי@dovid
למרות כל הנסיונות שלי לחפש משהו על הפורמט הזה, לא מצאתי כלום בגוגל (בזה אני כמובן לא יותר טוב ממך)
הדבר המשמעותי ביותר הכי טוב שמצאתי בגוגל, היה השאלה הזו .....אתה יודע מה השם של המרכזיה?
כי אז אולי אפשר לחפש את השם שלה + המילים cdr logמה מונע ממך לעבור בתוך המשרד פנימה למרכזיית אסטריק פשוטה ביותר?
ככל שזה נשאר בגבולות המשרד בלבל חלק גדול מאד משאלת האבטחה (שהיא הבעיה הגדולה במרכזיות) מתייתר.
ואני חושב שזה יפתח לך מליון אפשרויות חדשות של דברים שתוכלו לעשות שם, כולל חיתוכים מעניינים, אינטגרציות מול התוכנה שם ועוד
ממליץ בחום -
קבצי קול בעברית חינם@גמליאל
מצאתי שכנראה לא צריך לעבוד כ"כ קשה, והשיטה הישנה עדיין עובדת, רק שהם לא משתמשים בה כנראה יותר בדף.
פשוט לגשת לדף (שם את זה בכוונה בתגית קוד - בסוף הפוסט שם את זה כלינק)https://translate.google.com/translate_tts?ie=UTF-8&q=%D7%A9%D7%9C%D7%95%D7%9D,%20%D7%96%D7%94%20%D7%91%D7%93%D7%99%D7%A7%D7%94.&tl=iw&total=1&idx=0&textlen=15&tk=350535.255567&client=webapp&prev=input
בפרמטר q לשים את המילים בעברית
הפרמטר tl זה השפה -
הו"ק באמצעות api@sholom
נכון
אבל ייתכן שאם יש לך חשבון בנדרים פלוס (שגובה דרך לאכארד)
ייתכן ותוכל עם API להוסיף חיוב הו"ק ולתת לו מזהה טוקן
(מצד שני בכזה מצד ייתכן שישר תוכל לתת לנדרים פלוס את המספר אשראי)
נ.ב. החיוב הקבוע (לרוץ בכל יום על הרשימה ולהעביר וכו) לא כזה קשה
עיקר האתגר זה הו"ק שלא עוברות וכו' לפעמים אין טעם לכתוב לבד משהו שמישהו אחר כבר כתבאז לכאורה נשארנו עם שהאלה הראשונה שלך איזה מערכת חיצונית עושה את זה. (קשר [קהילות] כבר כתבתי שעושה בוודאות)
מן הסתם החברים כאן שיש להם שליטה טובה בנדרים פלוס יוכלו לומר לך אם זה קיים גם בנדריםעריכה:
מחיפוש בפורום נראה שאכן גם לנדרים יש אפשרות כזו ואז ההו"ק מנוהל שם וכו
עיין כאן לדוגמא
https://tchumim.com/post/129632
עריכה 2:
זה יותר ממוקד
https://tchumim.com/post/137795 -
הו"ק באמצעות api@sholom
מול איזה חברה אתה עובד באשראי?שים לב שבגדול אתה אמור לנהל את כל המערך לבד.
ז"א, אתה מקבל טוקן שהוא מייצג כרטיס אשראי, וצריך לבדוק בכל יום למי יש חיוב ולהגיש אותו וכו'
יש גם מערכות חיצוניות שעושות את העבודה מה שאכתוב כאן מתייחס יותר במצב שבו תחליט לממש את זה בעצמך.
ייתכן מאד שתמצא שיותר נח שתוכנה חיצונית תנהל את זה עבורך ואתה רק תשלח לה את הפרטיםש אתה רוצה (לא ניסיתי את זה כ"כ עד היום, מה שאני התנסתי זה היה לממש את התהליך מול חברת האשראי מקצה לקצה)
[היה פעם אחת בלבד שעשיתי את זה עבור לקוח, והמערכת החיצונית שעשתה את זה עבורם היתה קשר. ייתכן שגם לנדרים פלוס יש כזה API - שווה לבדוק]לגבי השאלות שלך:
-
עקרונית בפלאכארד (מניח שגם באחרים) אתה יכול להקים טוקן גם בלי אייפריים אלא אתה מגיש בקשת API עם מספר כרטיס ותוקף, ומקבל טוקן.
(אני לא נכנס כעת להיבט החוקי האם מותר כאשר אין לך תקן PCI - להערכתי כל מי שמשתמש בסליקת אשראי במרכזיה עושה את זה ללא התקן ממילא) -
לגבי בדיקה האם יש הו"ק, לכאורה תצטרך לנהל את זה בDB משלך, ואז השמיים הם הגבול
-
אתה ממילא צריך לנהל את זה בDB בעצמך, אז פשוט אתה יכול לסמן האם ההוק פעילה או לא.
תנסה להציץ על הדף הזה
https://gateway20.pelecard.biz/services
לדוגמא על הפונקצייה ConvertToToken
היא מקבלת את הפרמטרים הבאים:{ "terminalNumber": "0962210", "user": "peletest", "password": "XXXXXXX", "creditCard": "458045804580", "creditCardDateMmYy": "1224", "addFourDigits": "false" }
ותחזיר לך (במידה ותשים שם משתמש וסיסמא נכונים) את הטוקן וכו
עריכה:
ייתכן שהדף הזה יהיה לך יותר נח (יש שם קצת יותר הסברים)
https://gateway20.pelecard.biz/SandboxServices?selectedMethodId=97 -
-
קבצי קול בעברית חינםשימו לב רק שאם זה פרוייקט ציבורי מדאי יכול להיות כאן הפרת זכויות יוצרים של גוגל (לא יודע כמה הם תובעים על כאלו דברים, אני יודע על חברות אחרות שתובעים זכויות יוצרים על TTS שלא בתשלום בהפרות כאלו)
-
מתממשקים מול פלאכארד? יש לכם בעיה שבגללה צריך לשדרג את המסוף בימים האחרונים?תודה למגיבים
המסוף להבנתי נשאר אותו דבר בדיוק. רק מגדירים לו EMV
לפי התיעוד בשב"א מי שמשתמש בסליקה טלפונית בלבד אין עדיין החלטה והמצב נשאר כשהיה, ולכן אני לא מקבל את הטענה שכעת בדיוק חייבית "לשדרג" את המסוף.
בנוסף (וחמור יותר) הם מחייבים לשדרג גם במסופי הו"ק, שהם לא יכול להיות בכלל EMVעיקר הטענה שלי על פלאכארד זה שהם יודעים שזה הולך להציף את כלל הלקוחות של בתי התוכנה ולא טורחים לעדכן אותם, כאשר בכל בעיה קטנה הם ישר שולחים מייל עידכון לבתי התוכנה.
זה לא ראוי בכלל.
ואני מוסיף על זה שבמקום מסויים יש תחושה שהסיפור כאן הוא רק איך להוציא עוד קצת כסף מלקוחות הקצה שלי, כי ישר הם שולחים לשיווק לשלם....
ונניח שבאמת צריך לשדרג את המסוף לEMV (הרי מדובר בפעולה מאד מאד מורכבת, הם צריכים עם גרזן לחצוב בתוך הSSD עד שהוא יסכים למסוף להיות EMV.... וז פעולה כ"כ קשה שדורשת תשלום של 250 שח על כל מסוף....), אין שום סיבה שיצטרכו לשלם מחיר של מסוף חדש....לכן אני חושב שאפשר להתאגד כמה בתי תוכנה ביחד ולהעמיד אותם במקום (בתי תוכנה זה הדבר היחיד שמזיז להם)
-
מתממשקים מול פלאכארד? יש לכם בעיה שבגללה צריך לשדרג את המסוף בימים האחרונים?@מנחם הבנתי שתלוי אם המסוף מלפני 2019
עדיין לא מובן לי אם זה מסוף הו"ק או רק של עסקאות טלפוניות למה צריך לשדרג אותו? -
מתממשקים מול פלאכארד? יש לכם בעיה שבגללה צריך לשדרג את המסוף בימים האחרונים?בימים האחרונים אני מתחיל לקבל הצפה של טלפונים מלקוחות עם שגיאות כמו שגיאה 200 - שגיאה יישומית
שגיאה שהמסוך נעול ועוד
משיחה עם פלאכארד עולה שהמסוף נחסם וצריך לשדרג אותו בעלות של 250 שח.דיברתי איתם וניסיתי להבין, אם זה גורף למה הם לא עידכנו את בתי התוכנה, הם טוענים בתגובה שזה לא תלוי בהם אלא בחברת האשראי
עדיין אני טוען, שהם יודעים שיש כזו בעיה רוחבית וכן באחריותם לעדכן את הלקוחות או לחילופין לפחות את בתי התוכנה.הם הצליחו כ"כ להרגיז אותי כעת בשיחה (תשובה כל הזמן שצריך לפנות לשיווק ולשלם וכו) במקום לענות בצורה ישירה על השאלה למה הם לא מעדכנים את בתי התוכנה (כשדיברתי איתם בפעם הראשונה והשניה אף אחד לא טרח לומר לי שזו בעיה רוחבית - הבנתי את זה רק כשאני רואה שזה משותף להרבה לקוחות) , עד כדי כך שאם יש כאן עוד כמה אני שוקל ללכת לחברה אחרת במאורגן רק על ההתנהלות הזו.
מישהו נתקל בבעיה דומה?
-
תוכנת קופה רושמת בחינם@חוקר
יש את SambaPos
https://github.com/emreeren/SambaPOS-3
שים לב שיש את הגירסה הישנה מעט חופשית לגמרי והיותר חדשה אני חושב שזה כבר בתשלום או רישיון מסויים.
הממשק בעברית -
חנות שמוכרת מדפסות עם תמיכההקוד בגדול מגוגל... (רק הייתי צריך למצוא את הבאפר הנכון) - אני רואה שזה היה עם API של הווינדוס
מצורף:
מימוש:PrinterSettings settings = new PrinterSettings(); Console.WriteLine(settings.PrinterName); OpenCashDrawer.OpenDrawer("");
הקלאס הסטטי:
using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using System.Text; namespace OpenCashDrawer { class OpenCashDrawer { public static void OpenDrawer(string printerName) { byte[] buffer = new byte[5] { (byte) 27, (byte) 112, (byte) 0, (byte) 25, (byte) 250 }; RawPrinterHelper.SendStringToPrinter(printerName, System.Text.Encoding.UTF8.GetString(buffer)); } } class RawPrinterHelper { // Structure and API declarions: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public class DOCINFOA { [MarshalAs(UnmanagedType.LPStr)] public string pDocName; [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile; [MarshalAs(UnmanagedType.LPStr)] public string pDataType; } [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd); [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool ClosePrinter(IntPtr hPrinter); [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di); [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool EndDocPrinter(IntPtr hPrinter); [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool StartPagePrinter(IntPtr hPrinter); [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool EndPagePrinter(IntPtr hPrinter); [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten); // SendBytesToPrinter() // When the function is given a printer name and an unmanaged array // of bytes, the function sends those bytes to the print queue. // Returns true on success, false on failure. public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount) { Int32 dwError = 0, dwWritten = 0; IntPtr hPrinter = new IntPtr(0); DOCINFOA di = new DOCINFOA(); bool bSuccess = false; // Assume failure unless you specifically succeed. di.pDocName = "RAW Document"; // Win7 di.pDataType = "RAW"; // Win8+ // di.pDataType = "XPS_PASS"; // Open the printer. if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) { // Start a document. if (StartDocPrinter(hPrinter, 1, di)) { // Start a page. if (StartPagePrinter(hPrinter)) { // Write your bytes. bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); EndPagePrinter(hPrinter); } EndDocPrinter(hPrinter); } ClosePrinter(hPrinter); } // If you did not succeed, GetLastError may give more information // about why not. if (bSuccess == false) { dwError = Marshal.GetLastWin32Error(); } return bSuccess; } public static bool SendFileToPrinter(string szPrinterName, string szFileName) { // Open the file. FileStream fs = new FileStream(szFileName, FileMode.Open); // Create a BinaryReader on the file. BinaryReader br = new BinaryReader(fs); // Dim an array of bytes big enough to hold the file's contents. Byte[] bytes = new Byte[fs.Length]; bool bSuccess = false; // Your unmanaged pointer. IntPtr pUnmanagedBytes = new IntPtr(0); int nLength; nLength = Convert.ToInt32(fs.Length); // Read the contents of the file into the array. bytes = br.ReadBytes(nLength); // Allocate some unmanaged memory for those bytes. pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength); // Copy the managed byte array into the unmanaged array. Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength); // Send the unmanaged bytes to the printer. bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength); // Free the unmanaged memory that you allocated earlier. Marshal.FreeCoTaskMem(pUnmanagedBytes); fs.Close(); fs.Dispose(); fs = null; return bSuccess; } public static bool SendStringToPrinter(string szPrinterName, string szString) { IntPtr pBytes; Int32 dwCount; // How many characters are in the string? dwCount = szString.Length; // Assume that the printer is expecting ANSI text, and then convert // the string to ANSI text. pBytes = Marshal.StringToCoTaskMemAnsi(szString); // Send the converted ANSI string to the printer. SendBytesToPrinter(szPrinterName, pBytes, dwCount); Marshal.FreeCoTaskMem(pBytes); return true; } } }