`
film
  • 浏览: 236796 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ActiveX控件开发的一些问题一,如何标记控件为安全

 
阅读更多
我们采用了ActiveX的方式开发了一个嵌入到页面的小程序,可以实现对多文件的上传。因为还不能支持断点续传所以只支持小文件的传输,但是能一次传输多个小文件对于邮件方面的应用也是很方便的。而且有进度条显示这也给了用户较好的提示。同时我们支持拖入功能,用户可以直接将文件拖入到控件中,即完成对上传文件的选取。

下面对开发中遇到的一些问题进行说明,全文基本为原创,其中参考了很多他人的经验和资料,参考处我会注明原出处。

第一个问题如何标记控件为安全

控件发布第一步如何将控件标记为安全的。如果不将控件标记为安全,浏览器将会web页面与控件交互时提示如下信息:

ActiveX不安全提示

MSDN上对这的解释是:默认,MFC ActiveX控件不被标记为可安全编写脚本和可安全初始化。当IE运行安全级别设置为中等或高时,都回提示控件不安全。

消除提示有两种办法,The first method uses the Component Categories Manager to create the appropriate entries in the system registry.即修改控件的DllRegisterServer函数来,在注册表中标记控件为安全的。The second method implements an interface named IObjectSafety on your control.第二种方法可以详见

http://dcs.isa.ru/www/vladimirv/inetsdk/inet0002.htm

这里就第一种方法进行说明,在MSDN上也有第一种方法的详细说明。网址:

http://support.microsoft.com/kb/161873/zh-cn

但是该方法有一些不足,这里结合Phinecos(洞庭散人)的blog

(http://www.cnblogs.com/phinecos/archive/2008/08/07/1263270.html)进行说明。

1.添加辅助函数

控件的基本结构中含有xxApp,xxCtrl,xxPropPage三个类。找到xxApp的头文件,添加三个辅助函数。

// 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);

// Helper function to unregister a CLSID as belonging to a component

// category

HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);

找到xxApp的实现文件,添加三个辅助函数的实现。

// 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;

}

// 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;

}

2.定义GUID

需要定义两个GUID用来注册控件安全性。

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}};

在控件自动注册完成后,可以在注册表的如下地方看到上面的两个GUID。

 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}

同时需要定义要注册为安全的CLSID。

控件有四个UUID,这里我们需要将xxCtrl的UUID注册成为安全的CLSID,因为我们控件的主体功能是在这个类中实现的。

const GUID CDECL BASED_CODE _tlid =

{ 0x7DE84B6C, 0x9969, 0x4DE0, { 0xBE, 0x25, 0xC6, 0xC0, 0x63, 0x20, 0xA3, 0x70 } };

const WORD _wVerMajor = 1;

const WORD _wVerMinor = 0;

const CATID CLSID_SafeItem =

{0x4e586c5a, 0xfd41, 0x4e4c, {0xb6, 0x6d, 0x63, 0xf1, 0x10, 0xc8, 0xc4, 0xb9}};

这里的CLSID_SafeItem就是xxCtrl的UUID。

3.修改注册代码

// DllRegisterServer - 将项添加到系统注册表

STDAPI DllRegisterServer(void)

{

/*这里是原来的注册代码

OLD

AFX_MANAGE_STATE(_afxModuleAddrThis);

if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))

return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))

return ResultFromScode(SELFREG_E_CLASS);

return NOERROR;*/

//NEW下面是新的注册代码

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(

CLSID_SafeItem, CATID_SafeForScripting) ))

return ResultFromScode(SELFREG_E_CLASS);

if (FAILED( RegisterCLSIDInCategory(

CLSID_SafeItem, CATID_SafeForInitializing) ))

return ResultFromScode(SELFREG_E_CLASS);

return NOERROR;

}

// DllUnregisterServer - 将项从系统注册表中移除

STDAPI DllUnregisterServer(void)

{

/*

OLD这里是原来的代码

AFX_MANAGE_STATE(_afxModuleAddrThis);

if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))

return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))

return ResultFromScode(SELFREG_E_CLASS);

return NOERROR;*/

//NEW下面是新的代码

HRESULT hr;

AFX_MANAGE_STATE(_afxModuleAddrThis);

// Remove entries from the registry.

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;

}

到此完成了控件的安全标记。

分享到:
评论

相关推荐

    Activex\C#开发ActiveX控件,.NET开发OCX控件案例

    ### Activex\C#开发ActiveX控件,.NET开发OCX控件案例 #### 什么是ActiveX控件? ActiveX控件是一种软件组件或对象,它能够被嵌入到Web页面或其他应用程序中,以增强功能性和交互性。这些控件允许在浏览器中运行...

    Windows XP Windows7通过注册表将 IE中 对未标记为可安全执行脚本的activex控件初始化并执行脚本 设置为启用

    标题中的“Windows XP Windows7通过注册表将IE中对未标记为可安全执行脚本的activex控件初始化并执行脚本设置为启用”涉及到的是Windows操作系统中Internet Explorer浏览器的安全配置问题。ActiveX控件是微软在IE...

    使用C#开发ActiveX控件.pdf

    在软件开发领域,ActiveX控件作为一种可重用的组件,被广泛应用于Windows平台的应用程序开发中。它不仅能够提供丰富的功能,还能增强应用程序的交互性和可扩展性。然而,传统的ActiveX控件开发通常依赖于C++等语言,...

    ActiveX 控件安全性demo.zip

    MFC ActiveX控件未标记为“安全脚本”和“安全初始化”。当控件在Internet Explorer中运行且安全级别设置为中或高时,这一点就变得很明显。在这些模式中的任何一种模式下,都可能会显示警告,表明控件的数据不安全,...

    使用C#开发ActiveX控件

    然而,对于一些老的或者是特定平台的技术,如ActiveX控件,C#开发者可能会遇到一些挑战。ActiveX控件是微软在早期Windows环境中用于创建可重用组件的一种技术,它依赖于COM(Component Object Model)接口。尽管.NET...

    C# ActiveX控件开发源码

    ActiveX控件是这些组件的一种形式,它们可以嵌入到网页中,为用户提供交互式功能,如播放视频、运行应用程序或者访问特定硬件设备。C#,作为.NET Framework的主要编程语言,也支持开发ActiveX控件。以下是对"ActiveX...

    C# 开发的ActiveX控件

    这篇内容我们将深入探讨如何使用C#来开发ActiveX控件,以及这一过程中的关键知识点。 首先,我们要明白C#与ActiveX的结合。虽然C#本身并不直接支持ActiveX控件的创建,但通过.NET Framework和COM(组件对象模型)的...

    VC环境下多波形显示ActiveX控件开发

    ActiveX控件的开发正是基于Visual C++这一环境进行的。 2. 应用场景:多波形显示控件主要应用在工业控制类软件中,用于对采集到的大量数据进行图形化展示,便于用户观察和分析数据波形。 3. ActiveX控件:ActiveX...

    开发安全标记的MFC_ActiveX_控件及在IIS网页中使用和发布

    // 修改为以下内容以标记控件为安全 CRegKey key; if (key.Create(HKEY_LOCAL_MACHINE, _T("Software\\Classes\\CLSID\\{YOUR_CLSID_HERE}")) == ERROR_SUCCESS) { key.SetValue(_T("SafeForScripting"), _T("1...

    vs2008 ActiveX控件__及__.rar

    首先,你需要创建一个新的项目,选择“类库”模板,然后在项目的属性中将输出类型设置为“ActiveX控件”。 ### 3. 创建C# ActiveX控件 在C#中,你需要实现`System.Windows.Forms.Control`基类或`System.Component...

    Active Audio Record ActiveX控件

    Active Audio Record ActiveX控件 可以直接录制声音为MP3、WAV、wma 、ogg、au、aiff 和vox格式的音频文件。您可以通过设置内码参量完全控制音像文件的质量。 <br> Active Audio Record ActiveX控件 支持...

    VC++6.0写ActiveX控件,和WEB通信的一些心得

    为了使控件能够在Web端正常加载,需要按照下面的方法来标记控件为安全类别: 1. **创建组件类别**:通过定义`CreateComponentCategory`函数来创建一个新的组件类别。 2. **注册类别**:通过`...

    mscomm32 activex 控件

    MSComm32.ocx 是一个ActiveX控件,主要用于串行通信(Serial Communication)的编程。在Windows应用程序开发中,它为开发者提供了一个简便的方式来处理串行端口,如COM1、COM2等。这个控件在VB6(Visual Basic 6)、...

    C#开发ActiveX控件及制作CAB包总结

    - `IObjectSafety`接口:ActiveX控件需要标记为可安全执行脚本,因此必须实现这个接口。`INTERFACESAFE_FOR_UNTRUSTED_CALLER`和`INTERFACESAFE_FOR_UNTRUSTED_DATA`常量表示控件对不受信任的调用者和数据是安全的...

    让ActiveX控件在网页上运行

    - 将“对没有标记为安全的ActiveX控件进行初始化和脚本运行”设置为“提示”。 - 将“下载未签名的ActiveX控件”设置为“提示”。 这些设置是为了降低安全风险的同时保证ActiveX控件可以被加载和运行。 3. **...

    Qt生成ActiveX控件

    Qt生成ActiveX控件是将Qt的图形用户界面(GUI)组件转换为可以在Microsoft Windows操作系统上运行的ActiveX对象的过程。ActiveX技术允许开发者创建可重用的组件,这些组件可以在不同应用程序中嵌入,以实现跨平台...

    VC环境下多波形显示activex控件的开发

    本文介绍了一种基于VC环境下的多波形显示ActiveX控件的开发方法,旨在解决现有控件功能单一、不支持多波形显示等问题。 #### 开发背景与需求分析 随着技术的发展,工业控制类软件及自动测试系统需要处理的数据量...

Global site tag (gtag.js) - Google Analytics