בעית ATL

דינדנקט

New member
בעית ATL

שלום לכולם יש לי בעיה בהגדרת קובץ IDL יש לי שני ממשקים IA1,IA2 שמוגדרים בקובץ A.IDL ובנוסף יש לי ממשק IB שמוגדר בקובץ B.IDL ועכשיו הבעיה אני רוצה ליצור מתודה בממשק IB שתקבל כפרמטרים את הממשקים IA1 ו- IA2 (שמוגדרים כאמור בקובץ A.idl) למישהו יש מושג איך ניתן לבצע זאת ? תודה מראש....
 

כאגאי

New member
לדעתי

פשוט לעשות אינקלוד :
import "A.idl";​
אני לא יכול לבדוק את זה כרגע כי אין לי VC על המחשב, אבל אם זיכרוני לא בוגד בי זה אמור להיות בסדר.
 

gilad_no

New member
כמו שאתה עושה לטיפוס אחר

[propget, id(2), helpstring("property A1")] HRESULT A1([out, retval] IA1** pVal);​
הפונקציה הנ"ל מחזירה מצביע לאובייקט מטיפוס IA1. אם הבעיה שלך שעדיין לא הגדרת את הממשקים (והם מוגדרים בהמשך הIDL), תוכל לכתוב interface IA1 בתחילת הקובץ וזה מודיע למהדר כי בהמשך מוגדר הממשק הנ"ל
 

gilad_no

New member
אופס, לא קראתי עד הסוף

אם הם מוגדרים לך בIDL אחר, אז זה באמת import
 

דינדנקט

New member
עדין יש לי בעיה

עשיתי import ובאמת הקובץ התקמפל אבל... שרציתי להשתמש בממשקים בתוכנית חיצונית נתקלתי בבעיה ביצעתי
#import "A.tlb" namespace,named_guids #import "B.tlb" no_namespace,named_guids​
אבל קיבלתי שגיאות של הגדרה כפולה של ממשקים שנמצאו ב A אולי יש לכם רעיון ? ובכל מקרה - תודה רבה
 

gilad_no

New member
עצה:

אני נוהג אחרת. כאשר אני צריך להעביר ממשקים שאני כתבתי (או אחרים - אבל לא משהו סטנדרטי), והם לא מוגדרים באותו IDL, אני נוהג להעביר מצביע לIDispatch או IUnknown ובתוך הCPP עצמו לקבל את המצביע האמיתי בעזרת QueryInterface. ככה אתה חוסך בעיות קומפילציה ותלויות שונות (כמו שמקרה שלך)
 

דינדנקט

New member
כן חשבתי על זה

אבל אני לא כל כך אוהב את הרעיון זה כמו להשתמש ב - void*
 

כאגאי

New member
ברוך הבא לעולם של MS

חוצמזה מה רע ב * void? איך אתה מעביר אינפורמציה לט'רד אחר ?
 

דינדנקט

New member
זה "רע" כי זה עושה את הקוד

פחות מובן, ואם אני יכול לא להשתמש ב void* זה עושה אותי בן-אדם שמח יותר......
 
למעלה