none
כתיבה של המערכת ל console RRS feed

  • שאלה

  • שלום רב,

    יצרתי תוכנה ב C# ובמהלך הריצה של התוכנה היא כותבת את השורה הבאה:recv failed with error: -1 10004

    כיצד אפשר להגדיר שלא ירשמו שורות שלא אני יזמתי ל console ?

    תודה על התשובה

    פנינה


    pnina

    יום חמישי 19 דצמבר 2019 06:33

תשובות

  • ודה על התשובה.

    בגלל אבטחה אני לא יכולה להעביר את הקוד ולכן אני מנסה לפרט עד כמה שניתן את המקרה (וכנראה שזה לא מספיק...)

    אנסה שוב, אולי הפעם זה יספיק, 

    * כתבתי פרויקט חדש מסוג Console application , הפרויקט הוא משמש כ PROXY בין תוכנה שכתובה ב JAVA לבין פונקציות שנארזו ב DLL

    * כאשר התוכנה הזאת עולה אני מעוניינת שיכתב ל console שהתוכנה עלתה ולצורך כך אני משתמשת בשורה:

    Console.WriteLine("Start : version 1.0.6");

    * לאחר מכן, כאשר מגיעה בקשה לתוכנה הזאת אני מפעילה את אחת מהפונקציות שנארזו מה DLL . 

    הבעיה היא שבנוסף לפעולה הרצויה של הפונקציה אני רואה שגם נכתבות שורות ל console  ואותן אני רוצה להסתיר .

    כלומר - את ה console שלי אני רוצה להציג ואת ה console שמגיע מהפונקציה של ה DLL אני רוצה להסתיר.

    (זה השערה שלי שיש console.writeLine בפונקציה של ה DLL החיצוני )

    לדוגמא שורה שנכתבה ל console ולא נכתבה מהתוכנה שלי:

    NetworkClient::Open

    Connect completed


    pnina

    אהלן פנינה, 

    לפני הכל אני שוב חוזר שכל הדיון כאן ניראה לי אבסורדי לחלטין מכיוון שברור מתוכן ההודעה שמדובר בהודעת שגיאה. לכן מה שצריך לעניין אותך זה לא כיצד להסתיר את ההודעה מה console אלא להבין את השגיאה שנובעת מהקוד של ה DLL כפי הניראה ולתקן אותה!

    ועתה נחזור לפעולה של הסתרת ההודעות...

    אם הבנתי נכון את הארכיטקטורה של המערכת שלכם, אז את יכולה פשוט להפעיל את מה שאת צריכה מה DLL ב thread נפרד עם GUI נסתר

    לפני הרבה מאוד שנים העברתי הרצאה בקבוצת המשתמשים של מייקרוסופט בנושא אשר כולל את הפעולה של הסתרת ה GUI:
    https://gallery.technet.microsoft.com/Under-the-hood-of-a-4082e05c

    בהרצאה הדגמתי כיצד אני יוצר אפליקציה אחת אשר מפעילה מספםר סוגים של GUI שונים. לצורך כך התבססתי על תבנית של פרוייקט Windows Forms. בפרוייקט בילתי את הצגת הטיופס של ברירת המחדל ובמקום זה הוספתי אפשרות להפעיל GUI מסוגים שוניםץ במאמצר הבא שכתבתי אפשר לקרוא יותר על הנושא ואני מאוד ממליץ:

    https://social.technet.microsoft.com/wiki/contents/articles/25700.c-sharp-multi-types-application.aspx

    * בתחתית המאמר יש קישור גם להורדה של קוד מלא של הדוגמה

     

    בעקרון צריך לזכור שכאשר את מריצה תהליך כלשהו (process) דרך חלון SHELL אז ההרצה אינה קשורה להצגה של המידע. מדובר בשני שלבים שמבוצעים על ידי התוכנה דרכה אנחנו מריצים את התוכנה. בעזרת המתוגה FreeConsole ניתן לנתק את ההרצה מה GUI (מה Console)

    כיוון אחר אולי תוכלי להעזר בקישור הבא (תבדקי את התגודות של Andy Lanng):
    https://www.codeproject.com/Questions/897716/Csharp-Read-Text-From-Console-Window-Asynchronousl?cmt=758852#cmt2_897716


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]



    יום שני 23 דצמבר 2019 01:53
    מנחה דיון

כל התגובות

  • שלום פנינה,

    את מכירה את המשפט שתמונה שווה אלף מילים?

    זה תופס לגבי קוד.
    כאשר את מנסה לתאר מה יש לך תצרפי את הקוד הרלוונטי כדי שנוכל לראות מה קיים כרגע ואולי אפילו להשתמש בזה כדי לבדוק את ההתנהגות

    * ישנם מחלקות רבות שאולי חלקן כולל מאפיינים מובנים להגדרה ובלי לראות קוד אנחנו במשחק ניחושים :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]


    יום חמישי 19 דצמבר 2019 13:43
    מנחה דיון
  • דרך אגב, ההודעה שאת מקבלת ניראית כמו הודעת שגיאה

    את צריכה לאתר את המקור לשגיאה ולתקן את הקוד ולא רק להסתיר את ההודעה מפני המשתמש


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום חמישי 19 דצמבר 2019 22:18
    מנחה דיון
  • האם אפשר לסגור לסגור את השרשור?
    שבת 21 דצמבר 2019 23:49
    בעלים
  • הי,

    אתאר קצת יותר מה אני מנסה לעשות.

    אני כותבת ב C# פרויקט console application ומייבאת DLL חיצוני שלצורך הדוגמא נקרא לו test.

    הייבוא נעשה באמצעות השורה הבאה:

       [DllImport("TEST.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "TEST")]

        static extern int TEST(string test, string context);

    בתוכנה שלי יש כתיבות ל console שאני צריכה אולם כאשר אני מפעילה פונקציות של ה DLL אני מקבלת כתיבות לא רצויות ל console

    כלומר, הפונקציות של ה DLL כותבות ל console של התוכנה שלי.

    האם יש דרך להסתיר רק את ההודעות שנכתבות ל console שמגיעות מהפונקציות של ה DLL

    תודה

    פנינה


    pnina

    יום ראשון 22 דצמבר 2019 09:46
  • אהלן פנינה,

    את שוב מתמקדת בהסברים במקום בנתונים טכניים

    זה פורום טכני :-)

    > אולי הספרייה של ה DLL מבצעת כתיבה מפני שזה מה שהיא נועדה לעשות?
    אם היית נותנת את השם של הספרייה במקום להתמקד בהסבר ארטילאי ושימוש בשם test אז אולי היינו יכולים לחקור את הספרייה ולבדוק מה האפשרויות של ההתנהגות בשימוש בה

    > את מספרת לנו ש "בתוכנה שלי יש כתיבות ל console" אבל לא מספרת לנו כיצד. באיזה מחלקה של איזה ספרייה את מבצעת את הכתיבה. מה הקוד שלך לביצוע הכתיבה?
    מי יודע כרגע... אולי הקוד איתו את כותבת ל console כולל מאפיינים לקבוע מה לכתוב ומה לא לכתוב. אם תראי לנו את הקוד לביצוע הכתיבה אז נוכל לחקור את הספרייה הרלוונטית ואולי גם לבדוק בפועל את ההתנהגות ואת הפתרון

    * אני רוצה להדגיש שהבעיה מובנת לי (ככל הנראה) כבר מההתחלה. פשוט חסר לנו מידע טכני של מה את עושה בפועל. יש לנו רק תיאור ההתנהגות. את מחפשת פתרון להתנהגות כאשר אין לנו מושג עעל המקור/סיבה להתנהגות. זה כמו להגיע לרופא ולהגיד לו שהבטן ששלך כואבת בלי לספר לו שאכלת 30 סופגניות בתחרות אכילה לפני שעה. נכון... הוא יוכל לבצע בדיקות פיזיות (מה שלנו אין אפשרות בפורום מפני שאין לנו אפשרות להריץ את הקוד שלך) אבל אם תתני לו את הנתון הטכני של למה כואבת לך הבטן (הסופגניות) אז הוא יוכל מייד לתת לך פתרון.

    1. אנא צרפי את המידע החסר: קוד שמראה כיצד את כותבת ל Console ושם הספרייה אשר מחזירה את הטקסט הלא נחוץ

    2. אם את יכולה לצרף קישור לקובץ zip הכולל דוגמה מלאה (פרוייקט) בסיסית הכוללת רק את שחזור הבעיה אז נוכל גם להריץ את הקוד ולראות את הבעיה


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום ראשון 22 דצמבר 2019 10:18
    מנחה דיון
  • בשפת C# הצורה הפשוטה ביותר לכתוב ל Console היא באמצעות המתודות: Console.Write או Console.WriteLine

    מתודות אלו לא כוללת אפשרויות סינון וניהול של מה כותבים אלא רק אפשרויות קביעת המקור של מה שרוצים לכתוב וכיצד. אם המתודה מקבלת מה DLL טקסט כלשהו כ input ובקוד שלך את לא מוודאת מה ה input אז המתודה פשוט תכתוב את מה שהעברת לה (שה DLL שהעביר לה).

    מניחוש ראשון הבעיה שלך היא קודם כל שאת מקבלת הודעת שגיאה ולא העובדה שההודעה נכתבת ל Console! את צריכה להבין מדוע בכלל מתקבלת ההודעה של השגיאה. ורק בשלב הבא את יכול להסתיר את כך שיש שגיאה על ידי פעולות שונות לפני שאת מעבירה את הנתון למתודה שכותבת את התוצאה.

    אל ה console תעביר פרמטר ולא את התשובה ישירות מה DLL. תוסיפי בדיקה לפני הכתיבה ל Console אשר מוודאת שהפרמטר לא כולל מה שהגיע מה DLL. אם יש צורך אז תסנני את הטקסט שאת מעבירה למתודה שכותבת וזהו בעקרון


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]




    יום ראשון 22 דצמבר 2019 10:26
    מנחה דיון
  • ודה על התשובה.

    בגלל אבטחה אני לא יכולה להעביר את הקוד ולכן אני מנסה לפרט עד כמה שניתן את המקרה (וכנראה שזה לא מספיק...)

    אנסה שוב, אולי הפעם זה יספיק, 

    * כתבתי פרויקט חדש מסוג Console application , הפרויקט הוא משמש כ PROXY בין תוכנה שכתובה ב JAVA לבין פונקציות שנארזו ב DLL

    * כאשר התוכנה הזאת עולה אני מעוניינת שיכתב ל console שהתוכנה עלתה ולצורך כך אני משתמשת בשורה:

    Console.WriteLine("Start : version 1.0.6");

    * לאחר מכן, כאשר מגיעה בקשה לתוכנה הזאת אני מפעילה את אחת מהפונקציות שנארזו מה DLL . 

    הבעיה היא שבנוסף לפעולה הרצויה של הפונקציה אני רואה שגם נכתבות שורות ל console  ואותן אני רוצה להסתיר .

    כלומר - את ה console שלי אני רוצה להציג ואת ה console שמגיע מהפונקציה של ה DLL אני רוצה להסתיר.

    (זה השערה שלי שיש console.writeLine בפונקציה של ה DLL החיצוני )

    לדוגמא שורה שנכתבה ל console ולא נכתבה מהתוכנה שלי:

    NetworkClient::Open

    Connect completed



    pnina


    יום ראשון 22 דצמבר 2019 10:33
  • ודה על התשובה.

    בגלל אבטחה אני לא יכולה להעביר את הקוד ולכן אני מנסה לפרט עד כמה שניתן את המקרה (וכנראה שזה לא מספיק...)

    אנסה שוב, אולי הפעם זה יספיק, 

    * כתבתי פרויקט חדש מסוג Console application , הפרויקט הוא משמש כ PROXY בין תוכנה שכתובה ב JAVA לבין פונקציות שנארזו ב DLL

    * כאשר התוכנה הזאת עולה אני מעוניינת שיכתב ל console שהתוכנה עלתה ולצורך כך אני משתמשת בשורה:

    Console.WriteLine("Start : version 1.0.6");

    * לאחר מכן, כאשר מגיעה בקשה לתוכנה הזאת אני מפעילה את אחת מהפונקציות שנארזו מה DLL . 

    הבעיה היא שבנוסף לפעולה הרצויה של הפונקציה אני רואה שגם נכתבות שורות ל console  ואותן אני רוצה להסתיר .

    כלומר - את ה console שלי אני רוצה להציג ואת ה console שמגיע מהפונקציה של ה DLL אני רוצה להסתיר.

    (זה השערה שלי שיש console.writeLine בפונקציה של ה DLL החיצוני )

    לדוגמא שורה שנכתבה ל console ולא נכתבה מהתוכנה שלי:

    NetworkClient::Open

    Connect completed


    pnina

    אהלן פנינה, 

    לפני הכל אני שוב חוזר שכל הדיון כאן ניראה לי אבסורדי לחלטין מכיוון שברור מתוכן ההודעה שמדובר בהודעת שגיאה. לכן מה שצריך לעניין אותך זה לא כיצד להסתיר את ההודעה מה console אלא להבין את השגיאה שנובעת מהקוד של ה DLL כפי הניראה ולתקן אותה!

    ועתה נחזור לפעולה של הסתרת ההודעות...

    אם הבנתי נכון את הארכיטקטורה של המערכת שלכם, אז את יכולה פשוט להפעיל את מה שאת צריכה מה DLL ב thread נפרד עם GUI נסתר

    לפני הרבה מאוד שנים העברתי הרצאה בקבוצת המשתמשים של מייקרוסופט בנושא אשר כולל את הפעולה של הסתרת ה GUI:
    https://gallery.technet.microsoft.com/Under-the-hood-of-a-4082e05c

    בהרצאה הדגמתי כיצד אני יוצר אפליקציה אחת אשר מפעילה מספםר סוגים של GUI שונים. לצורך כך התבססתי על תבנית של פרוייקט Windows Forms. בפרוייקט בילתי את הצגת הטיופס של ברירת המחדל ובמקום זה הוספתי אפשרות להפעיל GUI מסוגים שוניםץ במאמצר הבא שכתבתי אפשר לקרוא יותר על הנושא ואני מאוד ממליץ:

    https://social.technet.microsoft.com/wiki/contents/articles/25700.c-sharp-multi-types-application.aspx

    * בתחתית המאמר יש קישור גם להורדה של קוד מלא של הדוגמה

     

    בעקרון צריך לזכור שכאשר את מריצה תהליך כלשהו (process) דרך חלון SHELL אז ההרצה אינה קשורה להצגה של המידע. מדובר בשני שלבים שמבוצעים על ידי התוכנה דרכה אנחנו מריצים את התוכנה. בעזרת המתוגה FreeConsole ניתן לנתק את ההרצה מה GUI (מה Console)

    כיוון אחר אולי תוכלי להעזר בקישור הבא (תבדקי את התגודות של Andy Lanng):
    https://www.codeproject.com/Questions/897716/Csharp-Read-Text-From-Console-Window-Asynchronousl?cmt=758852#cmt2_897716


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]



    יום שני 23 דצמבר 2019 01:53
    מנחה דיון
  • שלום רונן,

    תודה על התשובה- זה ענה לבעיה שהנוצרה לי !

    לגבי מה שכתבת , לטפל בשגיאה שחוזרת :

    1) התוכנה הזאת משמשת כ PROXY  ומעבירה את השגיאות אם יש לתוכנת ה JAVA שמנתחת את המידע ופועלת בהתאם

    2) תוכנת ה C# רצה אצל לקוחות ואני לא מעוניית שיקפוץ ללקוח השגיאות ל console . לכן חשוב לי להסתיר אותם.

    3) פונקציות ה DLL כותבות גם מידע אינפורמטיבי ל console  ולא רק שגיאות ואני לא מעוניינת שיוצגו

    4) מידע נצרך נכתב לקובץ לוגים.

    שוב תודה על התשובה

    פנינה


    pnina

    יום שני 23 דצמבר 2019 07:57
  • בכיף :-)

    אני שמח שיכולתי לעזור

    פנינה, אל תשכחי לסגור את השרשור על ידי סימון אחת או יותר מהתגובות כתשובה 


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום שני 23 דצמבר 2019 11:33
    מנחה דיון