Q:
VC6生成MFC ActiveX,使用htm调用,
CLASSID="CLSID:12342234-3234-4234-5234-623472348234"
CODEBASE="testocx.cab#version=1,0,0,1"
在WinXPSp1上,http://www.smth.org/,ok
在WinXPSp2/2k3SP1/Vista上,http://www.smth.org/,红X
在WinXPSp2/2k3SP1/Vista上,file:///C:/ActiveX.htm,ok
A:
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实现文件中包括两个文件:
#include <comcat.h>
#include <objsafe.h>
// 本控件的CLSID,注册表用
const GUID CDECL CLSID_SafeItem ={ 0x12342234, 0x3234, 0x4234,
{ 0x52,0x34,0x62,0x34,0x72,0x34,0x82,0x34 } };
// 版本控制
const WORD _wVerMajor = 1;
// 次版本号
const WORD _wVerMinor = 0;
实现
// CTestApp::InitInstance - DLL initialization
BOOL CTestApp::InitInstance() {
return COleControlModule::InitInstance();
}
// CTestApp::ExitInstance - DLL termination
int CTestApp::ExitInstance() {
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 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;
}
// 注册组件种类
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(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;
}
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void) {
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
// 标记控件初始化安全.
// 创建初始化安全组件种类
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;
// 标记控件脚本安全
// 创建脚本安全组件种类
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 registry
STDAPI DllUnregisterServer(void) {
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
// 删除控件初始化安全入口.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
if (FAILED(hr)) return hr;
// 删除控件脚本安全入口
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr)) return hr;
return NOERROR;
}
atl实现的ocx,在声明文件CTestCtl.h中:
class CTestCtl :
.... ,
public IObjectSafetyImpl<CTestCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
...
BEGIN_COM_MAP(CTestCtl)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
...
}
或者:
BEGIN_CATEGORY_MAP(CTestCtl)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
END_CATEGORY_MAP()
分享到:
相关推荐
本文将详细介绍如何解决ActiveX控件在IE中弹出安全警告的问题。 #### ActiveX控件与安全警告 ActiveX控件是一种可以在网页上运行的小型应用程序。它们可以增强网页的功能性和互动性,但同时也可能成为潜在的安全...
ActiveX控件是微软在Internet Explorer浏览器中引入的一种技术,用于增强网页的交互性和功能。在Web开发的早期,ActiveX被广泛应用于提供多媒体内容、软件下载、在线应用程序以及各种定制的用户界面元素。本文将深入...
非IE内核浏览器ActiveX支持插件是一种技术解决方案,它使得在非Internet Explorer(IE)浏览器上也能使用ActiveX控件。ActiveX是微软开发的一种技术,主要用于在Web页面中集成各种功能,如媒体播放、Java小应用或者...
### IE提示限制脚本或ActiveX控件运行的解决方案 在使用Internet Explorer浏览器访问某些包含脚本或ActiveX控件的网页时,用户可能会遇到一个警告提示:“Internet Explorer已限制此网页运行脚本或ActiveX控件”,...
在本文中,我们将深入探讨如何使用ATL工程创建ActiveX控件,并理解在Internet Explorer(IE)中如何处理`object`引用的生命周期,特别是当涉及到frameset页面跳转时的情况。 首先,创建一个ATL工程,你需要在Visual...
此外,现代浏览器如Chrome、Firefox默认不支持ActiveX,这可能导致在其他浏览器中无法正常使用C# Activex控件。开发者需要考虑跨浏览器的兼容性问题,或者寻找替代技术,如使用WebAssembly、JavaScript框架等。 6. ...
总结来说,虽然ActiveX技术在现代Web开发中逐渐被边缘化,但在某些特定场景下,尤其是在仍依赖IE的旧系统中,利用ActiveX调用USB摄像头仍然是一个可行的解决方案。然而,考虑到兼容性和安全性,开发者应尽量转向...
在Internet Explorer中,ActiveX控件可以实现更复杂的功能,如文件操作或与本地系统交互。然而,由于安全性和兼容性问题,现代浏览器已不再支持ActiveX,因此本项目可能只适用于使用IE的场景。 5. **浏览器厂商检测...
在IT行业中,ActiveX控件是一种在Windows操作系统中广泛使用的组件技术,主要应用于早期的互联网浏览器,如Internet Explorer。在本教程中,我们将探讨如何使用C#语言编写ActiveX控件,并实现与网页的交互,包括如何...
### IE加载未签名的ActiveX控件解决方案 在IT领域,特别是Web开发和维护工作中,经常会遇到关于浏览器兼容性及安全策略的问题。其中,“IE加载未签名的ActiveX控件”是一个常见且令人头疼的问题。许多硬件设备配套...
在本文中,我们将深入探讨如何使用Microsoft ...而面对"winocc.cpp"错误,我们需要理解其背后的原理,细心排查代码,调试运行环境,并积极寻求解决方案,以确保我们的ActiveX控件能够顺利地在各种环境中运行。
在“应用程序”选项卡中,将目标框架设置为.NET Framework 4.x或更低版本,因为ActiveX控件不支持.NET Core或.NET 5+。 2. **启用Com互操作性**:在项目属性的“生成”选项卡中,勾选“使此项目适合COM互操作”。 ...
在网页中,通过JavaScript或者其他脚本语言与ActiveX控件交互,实现数据交换和特定任务的执行。本篇将详细讲解如何在网页中向C++编写的ActiveX控件传递参数。 一、ActiveX控件基础 1. ActiveX控件的创建:使用...
### vc控件在IE8中不能调试的解决办法 #### 问题背景 在使用Visual C++(VC)开发Web浏览器中的ActiveX控件时,可能会遇到一个常见的问题:即在Internet Explorer 8(IE8)中无法进行有效的调试。这个问题主要是...
Web截图ActiveX控件是一种专为网页设计的屏幕...总的来说,"web截图activex控件"提供了一种在网页环境下便捷截图的解决方案,但随着技术的发展,开发者和用户都需要考虑其安全性和兼容性问题,寻求更现代的替代方案。
在IT行业中,开发ActiveX控件是创建可嵌入到其他应用程序(如Web浏览器)中的自定义功能组件的重要方法。...尽管存在安全性和跨平台的问题,但在特定的应用场景下,ActiveX控件仍然是一种有效的解决方案。
通过Delphi和相关的工具,开发者可以创建出能够在网页中提供强大功能的ActiveX控件,如本文中的打印功能。尽管过程中可能遇到调试困难和文件大小的问题,但通过学习和实践,这些都可以得到解决。
4. 浏览器兼容性:由于非IE浏览器不支持ActiveX,因此需在代码中检测用户浏览器类型,针对不同浏览器提供相应的解决方案。 五、安全和风险 尽管CAB文件和ActiveX控件提供了便捷的部署方式,但也存在安全隐患。恶意...
这可能是由于多种原因引起的,包括但不限于浏览器兼容性问题、JavaScript或CSS错误、ActiveX控件禁用等。本文将深入探讨这个问题,并提供解决方案。 树形控件(TreeView)是一种常见的用户界面元素,它以层级结构...