想建立乙個能夠在ie中成功載入而沒有「不安全」的警告或者錯誤提示資訊的activex控制項,我們必須實現安全的初始化和指令碼。基本上,所有要做的工作都是在dllregisterserver 和dllunregisterserver這兩個函式中完成的。下面,我們就來一步步地將我們的activex控制項變成乙個「安全的」控制項。
1. 編輯***(此處為控制項的工程名).cpp並新增如下的**。其中,clsid_safeitem的值應該跟***ctrl.cpp中的implement_olecreate_ex一致,這就等同於你的activex控制項。同樣,它也應該跟你的html頁面中的objectid標籤中的clsid一致。
以下是我工程中為實現安全的初始化和指令碼新增的**,可以與原先ide自動生成的部分做對比檢視那些部分是新增的,哪些部分是在建立activex控制項時自動生成的**:
#include "stdafx.h"
#include "ccea.h"
#include "comcat.h"
#include "strsafe.h"
#include "objsafe.h"
#ifdef _debug
#define new debug_new
#endif
/*const guid cdecl based_code _tlid =
};*/
const guid cdecl based_code _tlid =
};const guid cdecl clsid_safeitem =
};const word _wvermajor = 1;
const word _wverminor = 0;
return binit;}
//建立component categories中的初始化安全和指令碼安全項
hresult createcomponentcategory(catid catid, wchar* catdescription)
鍵值被註冊
categoryinfo catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409; // english
//size_t len;
// 確認描述不是太長。
// 只複製開始的127個字元。
// stringcchlength的第二個引數表示被讀入catdescription的最大字元數。
// 第三個引數表示字串的長度
//hr = stringcchlength(catdescription, strsafe_max_cch, &len);
int len = wcslen(catdescription);
if (succeeded(hr))
}
else
wcsncpy(catinfo.szdescription, catdescription, len);
//hr = stringcchcopy(catinfo.szdescription, len + 1, catdescription);
// 新增字串結束符.
+ 1] = '\0';
catinfo.szdescription[len] = '/0';
hr = pcr->registercategories(1, &catinfo);
pcr->release();
return hr;}
2. 然後需要新增註冊元件分類資訊
同樣是在***(此處為控制項的工程名).cpp並新增如下的**:
//在clsid中建立與component categories中初始化安全和指令碼安全項中相對應的implemented categories項
hresult registerclsidincategory(refclsid clsid, catid catid)
if (pcr != null)
pcr->release();
return hr; }
//登出與clsid中的相應implemented categories項,一般用不到,因為其它程式可能也會用到這此項
hresult unregisterclsidincategory(refclsid clsid, catid catid)
if (pcr != null)
pcr->release();
return hr;
}
這兩個方法是全新的必須新增。
3. 需要修改dllregisterserver函式如下,可以與原先ide自動生成的部分做對比檢視需要增加的部分:
// dllregisterserver - 將項新增到系統登錄檔
stdapi dllregisterserver(void)
4. 最後修改修改dllunregisterserver函式,可以與原先ide自動生成的部分做對比檢視需要增加的部分:
// dllunregisterserver - 將項從系統登錄檔中移除
stdapi dllunregisterserver(void)
#include "stdafx.h"
#include "ccea.h"
#include "comcat.h"
#include "strsafe.h"
#include "objsafe.h"
#ifdef _debug
#define new debug_new
#endif
/*const guid cdecl based_code _tlid =
};*/
const guid cdecl based_code _tlid =
};const guid cdecl clsid_safeitem =
};const word _wvermajor = 1;
const word _wverminor = 0;
return binit;}
//建立component categories中的初始化安全和指令碼安全項
hresult createcomponentcategory(catid catid, wchar* catdescription)
鍵值被註冊
categoryinfo catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409; // english
//size_t len;
// 確認描述不是太長。
// 只複製開始的127個字元。
// stringcchlength的第二個引數表示被讀入catdescription的最大字元數。
// 第三個引數表示字串的長度
//hr = stringcchlength(catdescription, strsafe_max_cch, &len);
int len = wcslen(catdescription);
if (succeeded(hr))
}
else
wcsncpy(catinfo.szdescription, catdescription, len);
//hr = stringcchcopy(catinfo.szdescription, len + 1, catdescription);
// 新增字串結束符.
+ 1] = '\0';
catinfo.szdescription[len] = '/0';
hr = pcr->registercategories(1, &catinfo);
pcr->release();
return hr;}
//在clsid中建立與component categories中初始化安全和指令碼安全項中相對應的implemented categories項
hresult registerclsidincategory(refclsid clsid, catid catid)
if (pcr != null)
pcr->release();
return hr; }
//登出與clsid中的相應implemented categories項,一般用不到,因為其它程式可能也會用到這此項
hresult unregisterclsidincategory(refclsid clsid, catid catid)
if (pcr != null)
pcr->release();
return hr;}
// dllregisterserver - 將項新增到系統登錄檔
stdapi dllregisterserver(void)
// dllunregisterserver - 將項從系統登錄檔中移除
stdapi dllunregisterserver(void)
這時你就能建立乙個能夠在ie中成功載入而沒有「不安全」的警告或者錯誤提示資訊的activex控制項了。
c 實現的ActiveX控制項
雖然應用範圍有限,但也算是一種嘗試吧。using system.runtime.interopservices namespace actwsz classinte ce classinte cetype.autodual public class acttest iact public strin...
vb的activeX控制項
vb6做了乙個簡單的activex控制項,還算是簡單,在專案選擇上選activex控制項,就會出現乙個沒有邊框的form,隨便放上乙個label,設定是center 中間對齊 選擇背景黑色,前景紅色,字型24,和vc比起來,vb可以設定字型大小,背景和前景顏色,vc可以設定y方向上的center。v...
乙個ActiveX控制項安全註冊的例子
include include include dllregisterserver adds entries to the system registry 原來的 被注釋 stdapi dllregisterserver void dllunregisterserver removes entrie...