שאלה ב VBSCRIPT ו COM/ACTIVEX

cganir

New member
שאלה ב VBSCRIPT ו COM/ACTIVEX

שלום. ברצוני לבנות דף HTML, אשר מכיל פקד ACTIVEX, נניח MOMO, ול MOMO יש מתודה המקבלת כפרמטר [in] משתנה מסוג BSTR. לדוגמא: MOMO.Open(bstrMyString) ב VB רגיל, אין לי בעיה לקרוא לפונקציה, והכל עובד חלק (אני מגדיר משתנה מסוג STRING ב VB, ומעביר את תוכנו אל הפונקציה.גם כאשר אני מעביר מחרוזת קבועה (לדוגמה "ABX") הכל עובד חלק. הבעיה מתחילה ב VBSCRIPT. פה אין לי אפשרות להגדיר משתנה מסוג טיפוס מסוים - כל השמתנים מוגדרים כ VARIANT. ברגע שאני מנסה לקרוא לפונקציה שלי עם משתנה כזה, אני מקבל שגיאת SYNTAX והסקריפט מפסיק את הפעולה. האם מישהו פה מכיר את הנושא ויודע איך מתגברים על הבעיה הזו ? תודה.
 

gilad_no

New member
VARIANT

הוא אמור להתאים את עצמו ע"פ סוג היעד (של המתודה בACTIVEX). בניתי בזמנו כמה פקדים ולא היו לי בעיות מיוחדות (עבדתי דרך JS אבל גם שם זה TYPLESS בדומה לVBS). פרט את הקוד שאיתו אתה מנסה להפעיל וכן את הגדרות הIDL של הפקד.
 

cganir

New member
תודה :) מחר בבוקר כשאחזור למשרד

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

cganir

New member
ואי. זה כבר עף לדף הבא ../images/Emo13.gif

אז הנה השורה מתוך ה ODL :
[id(8)] short Open(BSTR* agent);​
זו ההגדרה הסטנדרטית של VC++ כאשר יוצרים פונקציה שמקבלת BSTR בעזרת ה WIZARD. האם זה נכון להעביר BSTR* ? או שמא היה עלי להעביר BSTR בלבד ? ואיך זה היה מתבצע ב MFC ? והנה קטע הקוד ב VBSCRIPT שאמור לקרוא לפונקציה הזו
Dim IPADDR IPADDR = IPAddressBox.Value ' Get IP Address res = COM_Object.Open(IPADDR)​
זה גם לא עובד כשמנסים כך :
res = COM_Object.Open IPADDR​
(ללא הסוגריים למשתנה IPADDR). בכל פעם שהקוד מגיע לביצוע השורה הזו, אני מקבל TYPE MISMATCH. איך אני ממיר את זה כמו שצריך ? תודה רבה !
 

gilad_no

New member
תיקונים

קודם כל, כל מתודה של COM אמורה להחזיר HRESULT (ולא SHORT). אם אתה רוצה ערך חזרה זה יהיה בפונקציה כפרמטר. בנוסף, BSTR לא מעבירים ככה.
HRESULT Open([in] BSTR szAgent,[out,retval] long nResult);​
 

cganir

New member
תשמע. את זה אני יודע. אבל את הODL

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

gilad_no

New member
תפתח את הפקד עם OLEVIEW

ותבדוק בדיוק מה הגדרות הIDL שם...
 

cganir

New member
משום מה גם שם ההגדרה היא זהה

גם שם ההגדרה זהה :
[id(0x0000000a), helpstring("Connect to a remote machine")] short Open(BSTR* agent);​
זה עובד ב VB, אז אין עם זה בעיה. למה זה לא עובד ב VBSCRIPT ? נסה לבד - בנה אפליקציית MFC ACTIVEX, והגדר מתודה בשם OPEN שמקבלת מחרוזת. תראה איך הוא מגדיר את הפונקציה ב ODL.
 

cganir

New member
ממשחק נוסף עם העסק, בניתי ACTIVEX

חדש, בו הגדרתי פונקציה אחת אוטומטית על ידי ה WIZARD, והשניה ידנית על פי החוקים. זה מה שיצא ב IDL שנבדק על ידי OLEVIEW :
[id(0x00000001)] VARIANT_BOOL foo2(BSTR* agent); [id(0x00000002)] HRESULT foo( [in] BSTR agent, [out] long* success);​
עכשיו לשאלה הקריטית - מה נכון יותר לעשות ? שתי המתודות עובדות. האם זה יפתור את בעיית ה TYPE MISMATCH ? הרי לא שיניתי כלום בהגדרת הפרמטר הנכנס - הוא עדיין BSTR. תודה.
 

gilad_no

New member
BSTR

אני מניח שאתה מקבל מחרוזת ולא מחזיר מחרוזת. תוריד את הכוכבית.
 

cganir

New member
זה לא ממש אמור לשנות.

יש לי גם פונקציה שכן מקבלת מחרוזת לצורך שינויה. גם זה עובד ב VB ולא ב VBSCRIPT.
 

gilad_no

New member
זה משנה

כי אם תקרא לזה כך:
obj.Open "Test"​
אז תקבל שגיאה כי אתה מעביר מחרוזת ולא מצביע למחרוזת.
 

cganir

New member
אוקי. נניח באמת ש VBSCRIPT לא מסוגל

העביר פוינטרים - מה אפשר לעשות במידה ואני כן מצפה לקבל חזרה ערך כלשהו ? לדוגמא :
Dim SomeStr SomeObject.GetSomeText(SomeStr) ... Do something with this received SomeStr ...​
יש רעיונות ?
 

gilad_no

New member
הוא מסוגל להחזיר ערך

פשוט צריך להגדיר אותו גם בתור OUT. אני לא עובד עם MFC כך שאני לא יודע בדיוק איך זה מתנהג שם. אני כותב עם ATL ללא MFC. נסה לבדוק בתיעוד של MFC. בכל מקרה, כאשר מגדירים פרמטר שאמור להחזיר גם ערך (משתנה), חייבים לציין אותו בתור OUT ולא רק IN. תבדוק את הסוגיה.
 

cganir

New member
אוקי. אני אבדוק. נראה לי חשוד כל

עניין ה COM וה ACTIVEX, ועוד יותר חשוד הצורה שבה ה WIZARD מממש קוד בצורה לא תקנית. צפה לתוצאות בקרוב
 

cganir

New member
אוקי. יש פה בעיה. עכשיו הגדרתי ידני

את הפונקציה : ב ODL :
afx_msg HRESULT Connect(BSTR agent);​
ב Class header :
afx_msg HRESULT Connect(BSTR agent);​
ובנוסף
dispidConnect = 31L,​
גם ב Dispatch Map של האובייקט :
DISP_FUNCTION(CMgw2400Ctrl,"Connect" , Connect , VT_HRESULT, VTS_BSTR)​
ולבסוף הפונקציה עצמה :
HRESULT CSomeObject::Connect(BSTR agent)​
ועכשיו לשוס - בכל פעם שאני קורא עכשיו לפונקציה, אני מקבל GPF והאקספלורר נסגר לי
מה עושים לכל הרוחות ? איך מתפעלים את הדבר הזה ? האם VBSCRIPT נידון לגלות של STRINGS בשימוש ב COM/ACTIVEX ?
 

cganir

New member
סליחה סליחה סליחה - תיקון קטן

ב ODL הפונקציה מוגדרת כך :
[id(31), helpstring("Alternative connect")] HRESULT Connect([in] BSTR agent);​
 

gilad_no

New member
עוד משהו

תוריד את RES= בVBS. הפונקציה עכשיו לא מחזירה ערך. פשוט תקרא לCONNECT עם מחרוזת בתור פרמטר.
myobj.Connect "123"​
 

cganir

New member
עדיין מתרסק.

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

gilad_no

New member
מצטער,

אבל זנחתי את MFC לפני הרבה זמן. אני כבר לא עובד איתה ואין לי כ"כ מושג איך היא מתנהגת ברכיבי ACTIVEX. או שתעבור לATL (ושם אני אוכל לעזור), או שתמשיך לחפש לבד. בהצלחה.
 
למעלה