Visual Sudio2019創建MFC ActiveX工程製作IE OCX插件

前言

最近因為工作需要,實現IE extension插件,現在將學到的內容細節記錄下來,本次的學習內容如下幾個主題:
  1. VS2019創建MFC ActiveX工程製作IE OCX插件
  2. VS2019中MFC ActiveX工程如何調試
  3. 註冊ocx插件
  4. 在IE中使用JS調用第三方DLL函數

ㄧ. VS2019創建MFC ActiveX專案

1.新建專案


2. 默認,直接點下一步

3. 由於不需要顯示AboutBox,取消打勾“有關於對話框”,點擊完成

4. 建好的專案,文件格式如下圖

二. 加入自己要加的方法

js可以調用的ocx函數,一般寫在CDemoAXCtrl類中,該類即爲控件類(一個ActiveX可以寫多個控件類,本文就使用默認生成的這個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 )
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>

完整教學就結束了

留言

這個網誌中的熱門文章

Little Endian VS Big Endian

Converting Between Byte Arrays and Hexadecimal Strings in Java