Visual Sudio2019創建MFC ActiveX工程製作IE OCX插件
前言
最近因為工作需要,實現IE extension插件,現在將學到的內容細節記錄下來,本次的學習內容如下幾個主題:
- VS2019創建MFC ActiveX工程製作IE OCX插件
- VS2019中MFC ActiveX工程如何調試
- 註冊ocx插件
- 在IE中使用JS調用第三方DLL函數
ㄧ. VS2019創建MFC ActiveX專案
1.新建專案
2. 默認,直接點下一步
3. 由於不需要顯示AboutBox,取消打勾“有關於對話框”,點擊完成
4. 建好的專案,文件格式如下圖
二. 加入自己要加的方法
js可以調用的ocx函數,一般寫在CDemoAXCtrl類中,該類即爲控件類(一個ActiveX可以寫多個控件類,本文就使用默認生成的這個CDemoAXCtrl控件類)
本人在DemoAXCtrl.cpp中添加了兩個隸屬於CDemoAxCtrl底下的方法,代碼如下
本人在DemoAXCtrl.cpp中添加了兩個隸屬於CDemoAxCtrl底下的方法,代碼如下
// JS調用返回 歡迎 xx,hello world!
BSTR CDemoAXCtrl::speakHelloWorld(LPCTSTR pname)
{
CString res("");
res.Format(_T("您好%s,hello world!"), pname);
return res.AllocSysString();
}
LONG CDemoAXCtrl::add(LONG a, LONG b) {
return a + b;
}
此時會有紅線,不用緊張,JS還不能調用,我們還需要在DemoAXCtrl.h & .cpp加入如下代碼
//DemoAXCtrl.h中,添加如下代碼
class CDemoAXCtrl : public COleControl
{
//此處爲默認生成的代碼
// 調度和事件 ID
public:
enum {
dispidSpeakHelloWorld = 1L,
dispidadd = 2L
};
protected:
// JS調用返回 歡迎 xx,hello world!
BSTR speakHelloWorld(LPCTSTR name);
LONG add(LONG a, LONG b);
};
//在DemoAXCtrl.cpp 中添加
// 調度映射
BEGIN_DISPATCH_MAP(CDemoAXCtrl, COleControl)
DISP_FUNCTION_ID(CDemoAXCtrl, "speakHelloWorld", dispidSpeakHelloWorld, speakHelloWorld, VT_BSTR, VTS_BSTR)
//VT_I4 表示long; VT_BSTR表示 BSTR;
//VTS_BSTR 表示 LPCTSTR
DISP_FUNCTION_ID(CDemoAXCtrl, "add", dispidadd, add, VT_I4, VTS_I4 VTS_I4)
END_DISPATCH_MAP()
DISP_FUNCTION_ID 被在調度映射中使用,用來定義一個OLE自動化函數。
DISP_FUNCTION_ID( theClass, pszName, dispid,pfnMember, vtRetVal, vtsParams )
DISP_FUNCTION_ID( theClass, pszName, dispid,pfnMember, vtRetVal, vtsParams )
VT_I4 表示long; VT_BSTR 表示BSTR
VTS_BSTR表示LPCTSTR; VTS_NONE 表示沒有輸入參數
- theClass:類的名字
- pszName:函數的外部名字
- dispid
- pfnMember:成員函數的名字
- vtRetVal:指定了函數返回類型的值(VT_開頭表示返回值類型)
- vtsParams:指定了函數參數表的一個或多個常量的用空格分隔的列表(VTS_開頭表示參數類型,多個參數以空格分隔)
//在DemoAX.idl中添加這兩個函數
// CDemoAXCtrl 的主調度接口
[
uuid(0266f790-8f07-4038-b5ee-45f75359c010)
]
dispinterface _DDemoAX
{
properties:
methods:
[id(1)] BSTR speakHelloWorld(BSTR name);
[id(2)] LONG add(LONG a, LONG b);
};
我們在類視圖中可看到上述添加的函數
通過上述過程,即編寫好一個可以js調用的ocx。
三、使用cmd指令註冊 DllRegisterServer 唯一標識ID
以admin權限開啟cmd,輸入regsvr32 控件路徑XXX,如下圖如果要註銷則是 regsvr32 控件路徑XXX -u
成功會出現一個視窗
成功後,之後打開DemoAX.idl 檔,往下滑找到 "類別資訊"的註解,如下圖,下圖這張專案名稱為DemoMfcAX,只需要在意 id等下會用到用可以了
四、js調用OCX
創建main.html
以下的 id 記得換
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>測試頁</TITLE>
</HEAD>
<BODY >
<input type="button" id="Button2" style="width:120px;height:30px;font-size:13px" name="Button1" value="測試OCX函數" onClick="btn1Click();">
<br>
<script>
function btn1Click(){
var DemoAx = document.getElementById("DemoAx");
var num = DemoAx.add(1,3);
alert(num);
var str = DemoAx.speakHelloWorld("張三");
alert(str);
}
</script>
</BODY>
<OBJECT ID="DemoAx" CLASSID="CLSID:0D35EE11-028F-4F80-A65B-3F7194759727" width= "0" height="0">
</OBJECT>
</HTML>
完整教學就結束了
留言
張貼留言