activex com 组件开发二 安全接口的实现

来源:互联网 发布:极客范树莓派网络配置 编辑:程序博客网 时间:2024/04/29 00:00

上篇文章介绍了 一个 控件的创建,但是控件嵌入ie 是不安全的行为 ,ie浏览器老弹出安全提示,这一节实现他的安全接口, 让ie 不弹出提示。

对于MFC写的ActiveX,通过修改注册表的方式来实现控件的安全性,微软说明http://support2.microsoft.com/kb/161873/en-us。下面做个简单的翻译:

1、在项目中创建两个文件  Cathelp.h

 

#include "comcat.h"// Helper function to create a component category and associated// descriptionHRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);// Helper function to register a CLSID as belonging to a component// categoryHRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);


2 、Cathelp.cpp

#include "stdafx.h"#include "comcat.h"#include "strsafe.h"#include "objsafe.h"// HRESULT CreateComponentCategory - Used to register ActiveX control as safe HRESULT CreateComponentCategory(CATID catid, WCHAR *catDescription){    ICatRegister *pcr = NULL ;    HRESULT hr = S_OK ;     hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,             NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    if (FAILED(hr))        return hr;     // Make sure the HKCR\Component Categories\{..catid...}    // key is registered.    CATEGORYINFO catinfo;    catinfo.catid = catid;    catinfo.lcid = 0x0409 ; // english    size_t len;    // Make sure the provided description is not too long.    // Only copy the first 127 characters if it is.    // The second parameter of StringCchLength is the maximum    // number of characters that may be read into catDescription.    // There must be room for a NULL-terminator. The third parameter    // contains the number of characters excluding the NULL-terminator.    hr = StringCchLength(catDescription, STRSAFE_MAX_CCH, &len);    if (SUCCEEDED(hr))        {        if (len>127)          {            len = 127;          }        }       else        {          // TODO: Write an error handler;        }    // The second parameter of StringCchCopy is 128 because you need     // room for a NULL-terminator.    hr = StringCchCopy(catinfo.szDescription, len + 1, catDescription);    // Make sure the description is null terminated.    catinfo.szDescription[len + 1] = '\0';     hr = pcr->RegisterCategories(1, &catinfo);    pcr->Release();     return hr;} // HRESULT RegisterCLSIDInCategory -//      Register your component categories information HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid){// Register your component categories information.    ICatRegister *pcr = NULL ;    HRESULT hr = S_OK ;    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,                 NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    if (SUCCEEDED(hr))    {       // Register this category as being "implemented" by the class.       CATID rgcatid[1] ;       rgcatid[0] = catid;       hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);    }     if (pcr != NULL)        pcr->Release();                return hr;} // HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid){    ICatRegister *pcr = NULL ;    HRESULT hr = S_OK ;     hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,             NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    if (SUCCEEDED(hr))    {       // Unregister this category as being "implemented" by the class.       CATID rgcatid[1] ;       rgcatid[0] = catid;       hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);    }     if (pcr != NULL)        pcr->Release();     return hr;}


3、在ActivexTest.cpp文件中,添加CLSID_SafeItem的定义

 上面括号中的值 ActivexTestCrtl.cpp中获取到  如图


 4、ActivexTest.cpp添加两个头文件:

    

#include "Cathelp.h"#include "objsafe.h"


5、ActivexTest.cpp中DllRegisterServerDllUnregisterServer函数.

// DllRegisterServer - 将项添加到系统注册表// DllRegisterServer - Adds entries to the system registrySTDAPI DllRegisterServer(void){HRESULT hr;    // HResult used by Safety FunctionsAFX_MANAGE_STATE(_afxModuleAddrThis);if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))return ResultFromScode(SELFREG_E_CLASS);// Mark the control as safe for initializing.hr = CreateComponentCategory(CATID_SafeForInitializing,L"Controls safely initializable from persistent data!");if (FAILED(hr))return hr;hr = RegisterCLSIDInCategory(CLSID_SafeItem,CATID_SafeForInitializing);if (FAILED(hr))return hr;// Mark the control as safe for scripting.hr = CreateComponentCategory(CATID_SafeForScripting,L"Controls safely  scriptable!");if (FAILED(hr))return hr;hr = RegisterCLSIDInCategory(CLSID_SafeItem,CATID_SafeForScripting);if (FAILED(hr))return hr;return NOERROR;}// DllUnregisterServer - Removes entries from the system registrySTDAPI DllUnregisterServer(void){AFX_MANAGE_STATE(_afxModuleAddrThis);// 删除控件初始化安全入口.   HRESULT hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);if (FAILED(hr))return hr;// 删除控件脚本安全入口   hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);if (FAILED(hr))return hr;if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))return ResultFromScode(SELFREG_E_CLASS);return NOERROR;}

7、到这 安全接口就完成实现,ie就不会弹出提示。



0 0
原创粉丝点击