如何将 MFC ActiveX 控件标记为安全,脚本和初始化
MSDN原文。ActiveX控件标记安全(可以不仅仅是MFC ActiveX)
概要
默认情况下,MFC ActiveX 控件未标记为对脚本编写是安全的和对初始化是安全的。控制运行在 Internet Explorer 中使用的安全级别设置为中或高时,这一点很明显。在上述这些模式中,控件的数据是不安全或不可能安全脚本中使用该控件,可能会显示警告。
有两个控件可用于消除这些错误的方法。第一个涉及实现 IObjectSafety 接口的控件,并对于想要更改其行为变得"安全"的互联网浏览器的上下文中运行的控件很有用。第二步是修改控件的 DllRegisterServer 函数,若要在注册表中标记该控件的"安全"。本文介绍了这些方法中的第二个。第一种方法,实现 IObjectSafety 接口,Internet 客户端 SDK 中介绍。
请记住一个控件应仅标记为安全,如果它是,事实上,安全。请参阅有关此说明 Internet 客户端 SDK 文档。在组件开发部分,请参阅"安全初始化和脚本的 ActiveX 控件"。
注意:本文不介绍如何将控件标记为安全的下载。有关代码下载和代码签名的详细信息,请参阅 Internet 客户端 SDK。
有两个控件可用于消除这些错误的方法。第一个涉及实现 IObjectSafety 接口的控件,并对于想要更改其行为变得"安全"的互联网浏览器的上下文中运行的控件很有用。第二步是修改控件的 DllRegisterServer 函数,若要在注册表中标记该控件的"安全"。本文介绍了这些方法中的第二个。第一种方法,实现 IObjectSafety 接口,Internet 客户端 SDK 中介绍。
请记住一个控件应仅标记为安全,如果它是,事实上,安全。请参阅有关此说明 Internet 客户端 SDK 文档。在组件开发部分,请参阅"安全初始化和脚本的 ActiveX 控件"。
注意:本文不介绍如何将控件标记为安全的下载。有关代码下载和代码签名的详细信息,请参阅 Internet 客户端 SDK。
更多信息
请按照这些步骤将 MFC ActiveX 控件标记为脚本安全而对初始化是安全的:
- 通过将下面的 cathelp.h 和 cathelp.cpp 文件添加到项目实施的 CreateComponentCategory 和 RegisterCLSIDInCategory 的帮助器函数。
Cathelp.h
#include "comcat.h" // Helper function to create a component category and associated // description HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription); // Helper function to register a CLSID as belonging to a component // category HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
Cathelp.cpp
#include "comcat.h" // Helper function to create a component category and associated // description 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 // Make sure the provided description is not too long. // Only copy the first 127 characters if it is int len = wcslen(catDescription); if (len>127) len = 127; wcsncpy(catinfo.szDescription, catDescription, len); // Make sure the description is null terminated catinfo.szDescription[len] = '\0'; hr = pcr->RegisterCategories(1, &catinfo); pcr->Release(); return hr; } // Helper function to register a CLSID as belonging to a component // category 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; }
- 修改标记为安全的控件 DllRegisterServer。
#include "CatHelp.h"
const CATID CATID_SafeForScripting = {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}}; const CATID CATID_SafeForInitializing = {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
const GUID CDECL BASED_CODE _ctlid = { 0x43bd9e45, 0x328f, 0x11d0, { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
STDAPI DllRegisterServer(void) { AFX_MANAGE_STATE(_afxModuleAddrThis); if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid)) return ResultFromScode(SELFREG_E_TYPELIB); if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE)) return ResultFromScode(SELFREG_E_CLASS); if (FAILED( CreateComponentCategory( CATID_SafeForScripting, L"Controls that are safely scriptable") )) return ResultFromScode(SELFREG_E_CLASS); if (FAILED( CreateComponentCategory( CATID_SafeForInitializing, L"Controls safely initializable from persistent data") )) return ResultFromScode(SELFREG_E_CLASS); if (FAILED( RegisterCLSIDInCategory( _ctlid, CATID_SafeForScripting) )) return ResultFromScode(SELFREG_E_CLASS); if (FAILED( RegisterCLSIDInCategory( _ctlid, CATID_SafeForInitializing) )) return ResultFromScode(SELFREG_E_CLASS); return NOERROR; }
- 您不想要删除的组件类别,因为其他控件可能正在使用它。
- 虽然没有定义一个 UnRegisterCLSIDInCategory 函数,默认情况下 DllUnregisterServer 控制的项,从注册表删除完全。因此,从控件的注册删除类别是几乎没有什么用处。
HKEY_CLASSES_ROOT\Component Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\Component Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
参考
Internet 客户端 SDK 组件开发的安全初始化和脚本运行 ActiveX 控件的