IDidspatch::GetTypeInfo

אלי ו.

New member
IDidspatch::GetTypeInfo

בתכנה שאני מפתח אני מאפשר ללקוחות להתחבר לאובייקטים לא ידועים מראש, ומאפשר להם להפעיל אותם. כדי לעשות את זה אני צריך לקרוא ל IDidspatch::GetTypeInfo הקוד נראה כזה:
// we need to determine the return type if( m_pTypeInfo==NULL ) { hresult = m_lpDispatch->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &m_pTypeInfo); if( FAILED(hresult)) { return FALSE; } }​
הענין הוא שבכל פעם שמנסים להתחבר לאפליקציה שה type library שלה נמצא בקובץ TLB ולא מוטמע ב EXE הפונקציה GetTypeInfo נכשלת. כרגע מה שמענין אותי זה איך ב MSDEV מטמיעים את ה TLB בתוך ה EXE (ראיתי ש MS עושים את זה עם אפליקציות אופיס)? לחלופין, איך למצוא ולהעלות את ה TLB?
 

אלי ו.

New member
תודה, ושאלה מטומטמת ../images/Emo163.gif

1. לא פותר את הבעיה ולכן צריך להשתמש ב LoadTypeLib (מצאתי את LoadRegTypeLib שאפילו נראה יותר מתאים) השאלה היא איך אם כל מה שיש לי זה ה programID ומצביע ל IDispatch אני מקבל בצורה אמינה את ה REGUID והגרסה?
 

אלי ו.

New member
משהו מוזר

נסיתי למצוא את ה TypeLib ע"י
LoadRegTypeLib(clsid,1, 0, LOCALE_SYSTEM_DEFAULT, &pptlib); -לא עובד נסיתי QueryPathOfRegTypeLib( clsid, 1, 0, GetUserDefaultLCID(),Path); -לא עובד​
נסיתי לעשות LoadLibrary פשוט ישירות ל TLB והכל עובד (אבל זה לא פתרון כי אני צריך למצוא את ה TypeLib כל פעם מחדש) נסיתי לעשות RegTypeLib ל TLB כלום לא עזר. רעיונות? אגב, בקשר לגרסה, האם יש דרך לדעת מה הגרסה האחרונה של ה TypeLib?
 

gilad_no

New member
לגבי LOADREG

זה טוען את הTLB שרשום ביחד עם בפקד (ברג'יסטרי). אם הוא לא רשום, זה לא יעזור לך ותצטרך לטעון אותה לבד. לגבי גירסה, אתה יכול להוציא אותה מתוך TYPEATTR שתקבל מתוך ITypeInfo ותקבל מתוך ITypeLib. וכמו שאמרתי לך, תוכל להטמיע את הTLB ביישום שלך ולטעון אותו ישירות משם בלי צורך לחפש אותו כל פעם מחדש. ושאלה: מי כתב את האובייקט COM? אם אתה, אז פשוט תתקן אותו כך שיכיל את הTLB (ויירשום אותו) וזה ייפתור לך את כל הצרות.
 

אלי ו.

New member
תשובות

ה TLB רשום ברג'יסטרי, עדיין הוא לא מוצא אותו. (לכן כתבתי שזה מוזר) הטמעתי את ה TLB באובייקט הניסוי שלי, GetTypeInfo עדיין נכשל. (אם כי Ole COM View הצליח לראות את הנתונים) כמובן שרשמתי אותו ווידאתי שהוא ברג'יסטרי. עקרונית התכנה אמורה להתחבר לכל אובייקט COM באופן דינמי בלי מידע עליו מראש. כרגע אני פשוט שוקל ללכת לרג'יסטרי ולנסות להוציא את הנתונים בעצמי. האם זה בטוח?
 
למעלה