קבלת ה clsid של ה typeinfo מ progid

אלי ו.

New member
קבלת ה clsid של ה typeinfo מ progid

בהמשך לשרשור בתחתית הדף, למדתי את הבעיה יותר ואני מסוגל לנסח את השאלה בצורה מעט יותר אינטיליגנטית. (אני מקוה) לתכנית שלי (C++ MFC) יש progid ממנו אני מקבל idispatch באוביקטים מסוימים (אופיס למשל) idispatch::GetTypeInfo מצליח, באחרים לא. מה שזה אומר זה שיש צורך לפנות ל TypeLib ישירות. הענין הוא שכדי להגיע ל TypeLib צריכים את ה clsid של ה typelib ולא את ה clsid של התכנית (אותו ניתן להשיג בעזרת CLSIDFromProgID) ומכאן אני מגיע לשאלה: איך מה progID אני משיג את ה clsid של ה typelib ואת הגרסה? אני יודע שאפשר לקחת את ה clsid של התכנית ולגשת ברגיסטרי ל HKEY_CLASSES_ROOT\Interface\{clsid}\TypeLib ולבדוק את הערכים, השאלה היא אם יש API שיעשה את זה?
 

אלי ו.

New member
מקפיץ ומתקן

מבדיקה מתברר לי שאי אפשר לקחת את ה clsid של התכנית ולבדוק ברג'יסטרי. כך שחזרנו שוב לשאלה הראשונה. איך מה progid (למשל myprog.document אפשר לקבל את ה TypeInfo)
 

gilad_no

New member
תשובות:

א. למה לא? ב. ליצור אובייקט IDISPATCH מאותו CLSID ואז לקבל ממנו את ITypeInfo.
 

אלי ו.

New member
זהו, שזה לא תמיד עובד

א. נסיתי לבדוק ברג'יסטרי. מסתבר שה clsid שמקבלים מה progid אינו ה clsid של ה TypeLib ברג'יסטרי יש מנגנון תרגום מסויים תחת HKE_CLASS_ROOT/Interface/{clsid שמתרגם בין ה clsid ל tlsid (ה ID של ה tlib) אבל משום מה ה clsid שם אינו אותו clsid שמקבלים מה progid מצורף קובץ טקסט שמסביר את המצב יחד עם ה ODL של אובייקט לדוגמה. (האוביקט נבנה כאפליקצית דיאלוג ב AppWizard עם תמיכה באוטומציה) ב. לא תמיד אפשר לקבל את ה ITypeInfo מה IDispatch הגעתי לכל התסבוכת הזו בדיוק בגלל הבעיה הזו. אוביקטים מסוימים לא עושים IMPLEMENT_OLETYPELIB וכל הבלגאן הכרוך, ולא תוכל לקבל מהם את ה ITypeInfo. אם תנסה ליצור ב AppWizard אפליקציה קטנה תומכת אוטומציה ותראה שברירת המחדל תהיה לא ליישם את ה מנגנון.
 

gilad_no

New member
CLSID

ישנם 2 סוגים: אחד לאובייקט עצמו (שדרכו אתה יוצר את האובייקט) והשני לסיפרייה עצמה (שאותו ניתן למצוא ברג'יסטרי) תחת האובייקט גם. לגבי ממשק ייעודי - אין לי מושג, מעולם לא נאלצתי לעשות זאת ולכן אין לי מושג אם קיים משהו כזה (אם אני אגלה - אני אודיע). בכל מקרה, זה לא כ"כ קשה לבנות זאת לבד (לאחר מעט פשפוש ברג'יסטרי). לגבי הTI, למה אתה לא יכול להשתמש בLOADTYPELIB וממנו להוציא את הTI?
 

אלי ו.

New member
למעשה יש שלושה

1) ראה ב ODL שצירפתי. זו בדיוק הבעיה, ה clsid שמקבלים מ CLSIDFromProgID אינו ה clsid שמופיע ברג'יסטרי תחת Interface ולכן אי אפשר לתרגם ממנו ל tlscid. לא מצאתי ברג'יסטרי אפשרויות מעבר אחרות בין ה clsid ל tlscid. 2) LoadTypeLib דורש ממך לדעת את מיקום קובץ ה TLB כדי לדעת את המיקום שלו צריך לדעת את ה tlscid וכך אני רודף אחרי הזנב של עצמי (ראה 1).
 

gilad_no

New member
LOADTYPELIB

כמו ששאלתי קודם, אם הרכיב הינו שלך, למה לא להפיץ את הTLB עימו? ואז אתה יכול לקרוא לLOADTYPELIB על הDLL עצמו (ולמצוא את המיקום שלו דרך GETMODULEFILENAME). אם תסביר יותר בפירוט מה בדיוק הפרוייקט שלך צריך לעשות, אני אוכל לעזור יותר טוב.
 

אלי ו.

New member
הפרויקט הוא שפת תכנות ייעודית

סביבת פיתוח + סביבת ריצה. (משמש לניהול שיחות טלפון) אני נותן תמיכה די פרימיטיבית ב COM אבל לא מדובר באובייקטים שאני מייצר. עד עכשיו רוב הלקוחות השתמשו רק ביישומי אופיס, והכל עבד. לאחרונה יש לי בעיות עם לקוחות קריאטיביים שיצרו אובייקטים משל עצמם ומתלוננים למה ב VB האוביקטים שלהם עובדים ובתכנה שלי לא. אם אין TLB אז אין לי מה לעשות (גם VB לא יעבוד) הבעיה היא שהמניאקים ב VB מוצאים את ה TypeLib ואני לא)
 

gilad_no

New member
ניסית לטעון אותו ישירות מהDLL?

יש לך דוגמא לכזה אובייקט (שעובד בVB ולא אצלך)? תן לי קישור ואולי אני אוכל לעזור. ועוד דבר, למה לא להשתמש בActiveScript כדי לנהל את זה? למה אתה צריך את הTYPELIB שלו?
 

אלי ו.

New member
בבקשה

שנה כמובן את הסיומת ל zip. מדובר בפרויקט מאוד פשוט תוצרת AppWizard עם כמה מתודות פשוטות. (הבחור שכתב את זה הוא תכניתן VB כך שאין שם משהו מסובך) נסה פשוט להוציא מה progid את ה TypeInfo. VB איכשהו עושה את זה, אני לא הצלחתי. הפרויקט שלי היא שפת תכנות, יש לי לקוחות שקוראים לסקריפטים כמו VBS למשל אבל זה פתרון שמתאים יותר לעבודות אצוה ולא תמיד מתאים מכיון שהעברת הנתונים בין האוביקט לתכנית אינה חלקה אם יש סקריפט באמצע. מה שאני צריך לבצע זה את הדבר הבא: לקבל פקודה בסגנון Method someobj,foo,param1 (כן, אני יודע שזה מכוער) לודא ש foo קיים על האוביקט (זה קל) ולתרגם את הפרמטרים לפורמט שהאובייקט מצפה לו (בשביל זה צריך את ה TypeInfo) ולקרוא ל foo. כל מה שיש לי זה את ה ProgID, שהוא "Telescraper2.Application". (זה גם כל מה שיש ל VB)
 

gilad_no

New member
לגבי הIDL שלך,

יש 3 CLSID כי יש לך 3 אובייקטים: הסיפרייה ו2 ממשקים שונים. אתה משתמש עם MFC? אני בעיקר עובד עם ATL נקי (וWTL) ולא משתמש עם MFC כאשר אני כותב ממשקי COM.
 

selalerer

New member
../images/Emo32.gif מערכת הפעלה מודרנית.

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