2008-11-06 74 views
0

我可以使用VS08的MFC/ActiveX模板來創建一個C++ ActiveX對象,我可以使用Javascript將它加載到HTML頁面和腳本中。但我不知道如何創建一個接口,允許我用Javascript調用組件的自定義方法。如何在C++中使用Javascript腳本編寫ActiveX對象

你能告訴我如何做到這一點?我在google上花費了兩個多小時,但沒有運氣。

謝謝。

回答

2

我不是非常熟悉MFC ActiveX包裝,但我可以回答一般意義的問題:

與從IDispatch接口派生可以通過自動化語言調用的接口的COM對象(如:Javascript)。這些方法還必須是「自動化兼容的」,這意味着參數可以轉換爲VARIANT類型,或者顯式爲VARIANT類型。請注意,對於輸入/輸出參數,類型必須爲VARIANT *,以使自動化「連接」起作用。我不知道如何使ActiveX對象在客戶端腳本中可訪問(例如:將其嵌入到頁面中),但是如果它具有從IDispatch派生的單個接口,則可以從Javascript(和其他自動化語言)。我希望幫助...

1

這適用於在HTML頁面中嵌入您的ActiveX容器,並調用一個方法:

<html> 
<body> 
<object height="0" width="0" id="myControl" classid="CLSID:AC12D6F8-AEB7-4935-B3C9-0E4FB6CF7FB1" type="application/x-oleobject"> 
</object> 
<script> 
    var activexObj = document.getElementById('myControl'); 
    if(activexObj != null) 
    { 
     var result = myControl.myMethod(); 
     document.write("Result: " + result + "<br/>"); 
    } 
    else 
    { 
     document.write("ActiveX component not found!<br/>"); 
    } 
</script> 
</body> 
</html> 
1

如果您使用的是VS08 MFC的ActiveX模板,你可能會看到一個片斷像這樣在控件的.h文件中(類聲明中,它的保護):

afx_msg void AboutBox(); 

DECLARE_DISPATCH_MAP() 

而且一個這樣的.cpp文件:

// Dispatch map 

BEGIN_DISPATCH_MAP(CActiveXOutlookCtrl, COleControl) 
    DISP_FUNCTION_ID(yourCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) 
END_DISPATCH_MAP() 

我從來沒有使用過這個,但這是您的調度接口 - 也就是您的對象上的其他人可以調用的方法。意思是:

  • 「AboutBox」是他們用來調用它的名稱。
  • DISPID_ABOUTBOX是函數的整數id(我認爲它是任意的,我會使用一個正數,因爲默認情況下有很多負數)。
  • AboutBox是方法名稱。
  • VT_EMPTY是方法的返回類型。
  • VTS_NONE是它所需的參數類型。

雖然也有DECLARE_MESSAGE_MAP()和DECLARE_EVENT_MAP(),這也可能是你想要的。

+0

一個微不足道的糾正,DECLARE_DISPATCH_MAP()應該遵循函數聲明。 – 2009-06-08 12:33:31

相關問題