++C ו- DLL

zontar

New member
++C ו- DLL ../images/Emo26.gif

אני מנסה ללמוד איך לבנות DLL ב C++ ולשלבו ב VB,אינני מצליח להבין מה מטרת קובץ ה DEF בפרוייקט ה DLL ומה אומרות כל ההצהרות כגון:
LIBRARY c_dll_4_vb DESCRIPTION ´A C++ dll that can be called from VB´ EXPORTS Resolve_Name_To_Ip @1​
בנוסף איני מבין איך בדיוק להצהיר על ה DLL שלי בתוך VB ומדוע עלי להצהיר עליו בצורה כזו:
Private Declare Function Resolve_Name_To_Ip _ Lib "E:\Documents and Settings\roboty1\Desktop\wsdll\Debug\wsdll.dll" _ (ByVal pcDomainToResolve As String, _ ByVal szReturnIP As String, _ ByRef iSize As Integer) As Long​
תודה רבה לכל מי שינסה להסביר
 

yair24

Member
תגיד לי משהו...

את הקובץ ששלחתי לך עם הDLL הפשוט פשוט הצלחת להריץ? יאיר
 

yair24

Member
לא הבנתי...

מה אתה רוצה להבין בקשר להצהרה על הפונקציה בVB?
 

zontar

New member
../images/Emo13.gif../images/Emo26.gif

לצערי מעט אחרי שקיבלתי ממך את הקובץ ה HD שלי הלך לעולמו ואיתו כל הקבצים שהיו לי...
בנוגע לDLL : ניגשתי לאתר שמסביר על שילוב DLL של ++C עם VB ובניתי את תוכנית הדוגמה משם (רצה ללא בעיות) :http://www.developerfusion.com/show/1973/ הבעיה היא שישנם מספר דברים שאיני מבין: 1)מה תפקיד קובץ ה DEF וכל ההגדרות שבו
2)מדוע אני מצהיר על הפונקציה שבתוך ה DLL כ LIB
3)בקובץ ה DLL ישנה הפונקציה הנ"ל:
long __stdcall Resolve_Name_To_Ip (char *pcDomainToResolve, char szReturnIP[500], int &iSize);​
מדוע אני מצהיר עליה כ stdcall__
ולא כהצהרה רגילה של פונקציה
תודה
 

yair24

Member
אני אגיד לך משהו...

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

zontar

New member
אז איך אתה עובד עם DLL../images/Emo35.gif או שויתרת

לגמרי
 

yair24

Member
למה לוותר?

עשיתי את הDLL שרציתי וזהו... השתמשתי בו והוא עבד. וזהו, יותר לא הייתי צריך אותו. יאיר
 

zontar

New member
ואולי מישהוא בכל זאת יוכל להסביר לי

על מה ששאלתי ...
תודה
 

zontar

New member
מנסה שוב ../images/Emo13.gif אולי מישהו יוכל לענות

על השאלות שלי ....
 

TZURYOAV

New member
קובץ ה DEF נותן הוראות ללינקר

אילו פונקציות לייצא,stdcall מציין את הסדר שבהם נדחפים הפרמטרים למחסנית LIB זה קיצור של LIBRARY זה הכל.
 

zontar

New member
אתה יכול לפרט מעט על stdcall ../images/Emo45.gif

תודה רבה
 

TZURYOAV

New member
כן,הפרמטרים נדחפים למחסנית

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

zontar

New member
רגע... וזה לא מה שקורה גם בקריאה

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

TZURYOAV

New member
נכון אבל הסדר בהם הפרמטרים

נדחפים למחסנית שונה וגם מי שאחראי לנקות את המחסנית המהדר לפי השיטה מוסיף את הקוד הנחוץ חוץ מזה שיש עוד שיטות להעברת פרמטרים ולא תמיד כולם מועברים בעזרת המחסנית ניתן להעביר פרמטרים גם ב REGISTERS
 

zontar

New member
../images/Emo45.gif תודה + עוד שאלה קטנה אחת-->

בקובץ DEF כאשר אני מכריז על הפונקציה שאני משתמש בה אז אני רושם את שם הפונקציה ואז : 1@. למה רושמים את זה
מה תפקידו
ומה ארשום אם למשל יש לי 2 פונקציות שונות בתוך ה DLL שבהם אני רוצה להשתמש
וכמובן המון תודה
 

TZURYOAV

New member
זה ה ORDINAL NUMBER

פשוט הסדר של הפונקציות בטבלת הייצוא אתה לא צריך אותם בכלל. מן הסתם תרשום 2@
 

zontar

New member
תודה רבה../images/Emo70.gif עזרת לי מאד. אני מאמין

שאחזור ממש בקרוב עם עוד שאלות
 

voguemaster

New member
תלוי לאיזה פונקציה

רוב ה-APIים של חלונות מוגדרים בתור stdcall. יש רק דבר אחד שאני לא מבין, לשם מה כל ההגדרות האלו שאתה מדבר עליהן ? זה ספציפית בגלל שה-DLL שאתה מנסה לבנות מתקשר עם VB או בכלל ? כי לכתוב DLL רגיל זה דבר פשוט להפליא, ה-WIZARD בונה לך תבנית פשוטה מאוד וכל מה שאתה צריך לעשות בחיים זה להוסיף פונקציות והגדרה בשבילן. עד כדי כך זה פשוט
 

zontar

New member
קודם כל תודה על כל התשובות---->

וכתשובה לשאלה מדוע אכפת לי מכל ההגדרות הנ"ל : א) אני מנסה לבנות DLL שיתקשר עם VB ובניתי אותו ע"פ דוגמה שהורדתי מהרשת וככה הראו בדוגמה הנ"ל. ב) אני מאמין שאם סוף סוף לומדים משהו אז לפחות ללמוד יסודי ולהבין מה עושים (אני לא אוהב לתכנת בלי לדעת מה עושה הקוד שלי - ולצערי זו הסיבה שקשה לי עם API ).
 

zontar

New member
../images/Emo5.gif אוףףף כבר עוד בעיה../images/Emo166.gif../images/Emo122.gif

יצרתי DLL ב ++C שמקבל מערך בגודל 7 מסוג INT וממלא אותו במספרים רנדומליים (ה DLL מתקמפל ועובד ללא בעיות). כאשר אני מנסה לקרוא לפונקציה מתוך VB אני מקבל הודעת type mismatch למרות שהמערך שלי ב VB גם מוגדר כמערך INTEGER בגודל 7. הקריאה לפונקציה שבDLL :
Dim arr(7) As Integer generate_numbers arr​
הנה הגדרת הפונקציה ב DLL שלי :
void __stdcall generate_numbers(int arr[7])​
(הגדרות הDLL בראש הדף נכונות כי עם DLL אחר פשוט יותר שרק מחזיר מספר אחד הכל עבד) מה הבעיה
תודה מראש.
 
למעלה