VC編寫瀏覽器中不彈出警告的ActiveX控制項

來源:互聯網
上載者:User

我們在編寫ActiveX控制項時,如果用在瀏覽器中,經常都會彈出現在啟動並執行指令碼不安全的提示, 如果給客戶使用,將會帶來極大不便。按照MSDN的介紹通常有兩種一種是實現IObjectSafe介面,一種是通過修改註冊表的方法。一般如果用ATL開發ActiveX控制項,就用實現ObjectSafe介面的方法。如果用MFC開發,我覺得還是用修改註冊表的方法比較方便。下面我們將第二種方法:

//要包括兩個檔案<br />#include "comcat.h"<br />#include "Objsafe.h"<br />// 本控制項的CLSID,註冊表用 const GUID CDECL CLSID_SafeItem =<br />{ 0x7AE7497B, 0xCAD8, 0x4E66, { 0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };<br />// 建立組件種類 HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)<br />{<br /> ICatRegister* pcr = NULL ;<br /> HRESULT hr = S_OK ;</p><p> hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,<br /> NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);<br /> if (FAILED(hr))<br /> return hr;</p><p> // Make sure the HKCR/Component Categories/{..catid...}<br /> // key is registered.<br /> CATEGORYINFO catinfo;<br /> catinfo.catid = catid;<br /> catinfo.lcid = 0x0409 ; // english</p><p> // Make sure the provided description is not too long.<br /> // Only copy the first 127 characters if it is.<br /> int len = wcslen(catDescription);<br /> if (len>127)<br /> len = 127;<br /> wcsncpy(catinfo.szDescription, catDescription, len);<br /> // Make sure the description is null terminated.<br /> catinfo.szDescription[len] = ''/0'';</p><p> hr = pcr->RegisterCategories(1, &catinfo);<br /> pcr->Release();</p><p> return hr;<br />}<br />// 註冊組件種類HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)<br />{<br /> // Register your component categories information.<br /> ICatRegister* pcr = NULL ;<br /> HRESULT hr = S_OK ;<br /> hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,<br /> NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);<br /> if (SUCCEEDED(hr))<br /> {<br /> // Register this category as being "implemented" by the class.<br /> CATID rgcatid[1] ;<br /> rgcatid[0] = catid;<br /> hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);<br /> }<br /> if (pcr != NULL)<br /> pcr->Release();<br /> return hr;<br />}<br />// 卸載組件種類HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)<br />{<br /> ICatRegister* pcr = NULL ;<br /> HRESULT hr = S_OK ;</p><p> hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,<br /> NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);<br /> if (SUCCEEDED(hr))<br /> {<br /> // Unregister this category as being "implemented" by the class.<br /> CATID rgcatid[1] ;<br /> rgcatid[0] = catid;<br /> hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);<br /> }</p><p> if (pcr != NULL)<br /> pcr->Release();</p><p> return hr;<br />}<br />// DllRegisterServer - Adds entries to the system registry STDAPI DllRegisterServer(void)<br />{<br />HRESULT hr;</p><p>AFX_MANAGE_STATE(_afxModuleAddrThis);</p><p>if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))<br />return ResultFromScode(SELFREG_E_TYPELIB);</p><p>if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))<br />return ResultFromScode(SELFREG_E_CLASS);</p><p> // 標記控制項初始化安全.<br /> // 建立初始化安全性群組件種類<br /> hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");<br /> if (FAILED(hr))<br /> return hr;<br /> // 註冊初始化安全<br /> hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);<br /> if (FAILED(hr))<br /> return hr;</p><p> // 標記控制項指令碼安全<br /> // 建立指令碼安全性群組件種類<br /> hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");<br /> if (FAILED(hr))<br /> return hr;<br /> // 註冊指令碼安全性群組件種類<br /> hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);<br /> if (FAILED(hr))<br /> return hr;</p><p>return NOERROR;<br />}<br />// DllUnregisterServer - Removes entries from the system registrySTDAPI DllUnregisterServer(void)<br />{<br />HRESULT hr;</p><p>AFX_MANAGE_STATE(_afxModuleAddrThis);</p><p>if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))<br />return ResultFromScode(SELFREG_E_TYPELIB);</p><p>if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))<br />return ResultFromScode(SELFREG_E_CLASS);</p><p> // 刪除控制項初始化安全入口.<br /> hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);<br /> if (FAILED(hr))<br /> return hr;<br /> // 刪除控制項指令碼安全入口<br /> hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);<br /> if (FAILED(hr))<br /> return hr;</p><p>//////////////////////////<br />return NOERROR;<br />}

轉自:vckbase  作者:王正平

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.