转自“http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html”。
VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件。(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网上发表相关内容的朋友们。)
ActiveX控 件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行。控件下载 一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件。这里控件容器就是浏览器,用户不需要通过浏览器 调用控件的属性或方法。因此,开发面向Web的ActiveX控件比开发桌面的控件还要简单些,所复杂的是如何将该控件很好地嵌入主页,使用户能正常浏览。下面介绍这个问题。
一. 创建MFC ActiveX项目
1. 打开VS2005新建MFC项目。这里我们取名为“ActiveXDemo”。
2. 输入项目名称为“ActiveXDemo”和项目位置。点击“确定”按钮,打开向导对话框。
WoSign 免费提供的时间戳服务URL: http://timestamp.wosign.com/timestamp
时间戳服务非常重要,添加时间戳后,即使您的代码签名证书已经过期,但由于您的代码是在证书有效期内签名的,则时间戳服务保证了此代码仍然可信,最终用户仍然可以放心下载,使得即使代码签名证书已经过期,您也无需重签和重新发布已经签名的代码。
3. 选择“控件设置”选项卡,具体设置可参考上图。其它选项卡为默认设置。最后点击“完成”按钮保存设置。
二. 添加控件方法
VC2005会为我们自动创建好MFC ActiveX程序框架,我们只要给该ActiveX控件添加方法即可。现在我们给控件添加一个“AddFun”方法,这个方法是将两个数相加并返回结果。
1. 点击“视图”,打开“类视图”窗口。
2. 展开“ActiveXDemoLib”项,选中“_DActiveXDemo”项。点击鼠标右键,选择“添加”下的“添加方法”。
3. 打开添加方法向导窗口。因为我们是添加一个加法方法,所以我们设置的返回类型为LONG型,方法名设为AddFun,添加两个LONG类型参数Add1,Add2。
4. 其它为默认设置,点击“完成”按钮完成添加方法。接下来我们打开“解决方案资源管理器”打开“ActiveXDemoCtrl.cpp”文件。
5. 打开代码视图,我们会发现VC2005已经为我们添加了一个“AddFun”方法,我们在方法内添加“return Add1 + Add2;”语句。
三、MFC Activex 安全问题:
1、在默认环境下,编译的MFC Activex控件,只能在本地代码中运行,即在http://localhost/xxx/xxx.htm中执行,而在http://127.0.0.1/xxx/xxx.htm中提示无相关属性,需要设置其初始化和脚本运行的安全性
ActiveX在远程IE页面上执行,需要实现安全接口。
在ATL写的ActiveX中,用IObjectSafety。
http://support.microsoft.com/kb/168371/en-us
在MFC写的ActiveX中,直接修改注册表。
http://support.microsoft.com/kb/161873/en-us
mfc实现的ocx,要在app实现文件中包括两个文件:
在ActivexDemo.cpp 文件中实现以下方法
CActivexDemoApp theApp;
const GUID CDECL BASED_CODE _tlid = { 0x344B8576 , 0xAB2C , 0x4D38 , { 0xAE , 0x7 , 0x73 , 0x74 , 0x22 , 0x89 , 0x72 , 0xEA } }; const WORD _wVerMajor = 1 ; const WORD _wVerMinor = 0 ;
// CActivexDemoApp::InitInstance - DLL 初始化 BOOL CActivexDemoApp::InitInstance() { BOOL bInit = COleControlModule::InitInstance();
if (bInit) { // TODO: 在此添加您自己的模块初始化代码。 }
return bInit; }
// CActivexDemoApp::ExitInstance - DLL 终止 int CActivexDemoApp::ExitInstance() { // TODO: 在此添加您自己的模块终止代码。 return COleControlModule::ExitInstance(); }
// 创建组件种类 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 HKCRComponent 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] = '