我們編寫乙個activex控制項在ie中執行,一般會彈出乙個安全提示,如何避免這種情況?下面是我在參考前人的文章後,總結出「在瀏覽器中執行時不彈出警告的activex控制項」的兩種編寫方法,予以備忘。注意,這裡不會彈出警告是說在執行時不會彈出
方法1:修改登錄檔
可能你在看完下面的過程後會發現,程式沒有乙個地方對登錄檔操作過。其實不然,這裡所謂的修改登錄檔的方法就是使用元件型別管理器(component categories manager)建立乙個正確的入口到系統登錄檔。ie通過檢測登錄檔判斷乙個控制項是否可以安全地初始化和指令碼操作。ie會通過呼叫 icatinformation::isclassofcategories 方法確定控制項是否支援給出的安全性分組。其中對登錄檔的操作都已經封裝起來,隱藏在底層了,所以看不到。
必須包括兩個標頭檔案
#include
#include
const guid cdecl clsid_safeitem =
;//用你的控制項類guid替換
// 註冊元件種類為安全
hresult addcategorysafty(catid catid, tchar* catdescription)
lstrcpyn((tchar*)(catinfo.szdescription), catdescription, len+1);
hr = pcr->registercategories(1, &catinfo);
pcr->release();
return hr;
}//移除已經註冊為安全的元件種類
hresult removecategorysafty(catid catid)
// 把你的控制項註冊到已經註冊為安全的元件種類
hresult registerclsidincategory(refclsid clsid, catid catid)
if (pcr != null)
pcr->release();
return hr;
}// 把你的控制項從安全元件種類移除
hresult unregisterclsidincategory(refclsid clsid, catid catid)
if (pcr != null)
pcr->release();
return hr;
}//使你的控制項不彈出警告地執行
hresult makeactivexsafty(refclsid clsid)
//去除控制項的安全執行性
hresult unmakeactivexsafty(refclsid clsid)
然後在dllregisterserver函式的「return noerror;」前新增如下**:
hresult hr = makeactivexsafty(clsid_safeitem);
if (failed(hr))
return hr;
在dllunregisterserver函式的「afx_manage_state(_afxmoduleaddrthis);」後新增如下**:
hresult hr = unmakeactivexsafty(clsid_safeitem);
if (failed(hr))
outputdebugstring(_t("去除控制項的安全執行性時出錯!"));
方法2:實現objectsafe介面
我建立了乙個mfc activex controlwizard的工程,工程為testax,它的控制項類是ctestaxctrl,下面所有的**和操作都是在這個類的標頭檔案和實現檔案中進行。紅色的部分是為了實現objectsafe介面而增加的**。
在標頭檔案中:
#if !defined(afx_testaxctl_h__c2084528_f93e_42d8_a13d_7e38775a0481__included_)
#define afx_testaxctl_h__c2084528_f93e_42d8_a13d_7e38775a0481__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
// #include
#include //增加這個標頭檔案
// testaxctl.h : declaration of the ctestaxctrl activex control class.
/// ctestaxctrl : see testaxctl.cpp for implementation.
class ctestaxctrl : public colecontrol
ulong far export ctestaxctrl::xmyobjsafe::release()
hresult far export ctestaxctrl::xmyobjsafe::queryinte***ce(refiid iid, void far* far* ppvobj)
//呼叫方法與資料是否可信任,設定這兩個標誌位就可以了
const dword g_dwsupportedbits = inte***cesafe_for_untrusted_caller | inte***cesafe_for_untrusted_data;
const dword g_dwnotsupportedbits = ~g_dwsupportedbits;
hresult far export ctestaxctrl::xmyobjsafe::getinte***cesafetyoptions(refiid riid,
dword __rpc_far *pdwsupportedoptions,
dword __rpc_far *pdwenabledoptions)
hresult far export ctestaxctrl::xmyobjsafe::setinte***cesafetyoptions(refiid riid,
dword dwoptionsetmask,
dword dwenabledoptions)
//不需要做其他的事情
return s_ok;
}詳細的介面實現步驟請參考msdn的《tn038: mfc/ole iunknown implementation》。
在程式執行時自動註冊ActiveX控制項
編寫delphi應用程式時,經常會遇到一些activex控制項 注 擴充套件名為ocx的控制項或dll的型別庫 它們為應用程式的開發提供了簡單的操作途徑。然而,這些程式在發布的同時,面臨activex控制項註冊問題。解決途徑 一 用安裝程式製作打包檔案,往往會給增加程式本身的大小,系統重灌時,則必須...
如何使程式在執行時自動註冊ActiveX控制項
編寫delphi應用程式時,經常會遇到一些activex控制項 注 擴充套件名為ocx的控制項或dll的型別庫 它們為應用程式的開發提供了簡單的操作途徑。然而,這些程式在發布的同時,面臨activex控制項註冊問題。解決途徑 一 用安裝程式製作打包檔案,往往會給增加程式本身的大小,系統重灌時,則必須...
執行時改變控制項大小執行時移動控制項MINICAR版
執行時改變控制項大小執行時移動控制項minicar版 vs2005.net編寫,網上找了找,見別人寫得挺複雜,自己寫了乙個.附件居然不能上傳.就把 發到下面吧,有個奇怪現象就是,vb6中新建工建,拖個picturebox框出來,拷入以下 即可,但vb.net中是不行的.如mousemove事件你必須...