`
Riddick
  • 浏览: 640386 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ActiveX控件在IE中不能显示的解决方案

阅读更多

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中弹出安全警告的解决办法.txt

    本文将详细介绍如何解决ActiveX控件在IE中弹出安全警告的问题。 #### ActiveX控件与安全警告 ActiveX控件是一种可以在网页上运行的小型应用程序。它们可以增强网页的功能性和互动性,但同时也可能成为潜在的安全...

    网页中显示带控件的ActiveX控件

    ActiveX控件是微软在Internet Explorer浏览器中引入的一种技术,用于增强网页的交互性和功能。在Web开发的早期,ActiveX被广泛应用于提供多媒体内容、软件下载、在线应用程序以及各种定制的用户界面元素。本文将深入...

    非ie内核浏览器activex支持插件

    非IE内核浏览器ActiveX支持插件是一种技术解决方案,它使得在非Internet Explorer(IE)浏览器上也能使用ActiveX控件。ActiveX是微软开发的一种技术,主要用于在Web页面中集成各种功能,如媒体播放、Java小应用或者...

    去掉IE提示:internet explorer 已限制此网页运行脚本或Activex控件

    ### IE提示限制脚本或ActiveX控件运行的解决方案 在使用Internet Explorer浏览器访问某些包含脚本或ActiveX控件的网页时,用户可能会遇到一个警告提示:“Internet Explorer已限制此网页运行脚本或ActiveX控件”,...

    ATL工程创建ActiveX控件并在IE中测试object引用的生命周期

    在本文中,我们将深入探讨如何使用ATL工程创建ActiveX控件,并理解在Internet Explorer(IE)中如何处理`object`引用的生命周期,特别是当涉及到frameset页面跳转时的情况。 首先,创建一个ATL工程,你需要在Visual...

    c# activex 控件

    此外,现代浏览器如Chrome、Firefox默认不支持ActiveX,这可能导致在其他浏览器中无法正常使用C# Activex控件。开发者需要考虑跨浏览器的兼容性问题,或者寻找替代技术,如使用WebAssembly、JavaScript框架等。 6. ...

    web开发IE内核通过ActiveX调用USB摄像头方法

    总结来说,虽然ActiveX技术在现代Web开发中逐渐被边缘化,但在某些特定场景下,尤其是在仍依赖IE的旧系统中,利用ActiveX调用USB摄像头仍然是一个可行的解决方案。然而,考虑到兼容性和安全性,开发者应尽量转向...

    VS2019+MVC+WEBAPI+ACTIVEX控件

    在Internet Explorer中,ActiveX控件可以实现更复杂的功能,如文件操作或与本地系统交互。然而,由于安全性和兼容性问题,现代浏览器已不再支持ActiveX,因此本项目可能只适用于使用IE的场景。 5. **浏览器厂商检测...

    c# 编写activex控件 并与网页交互

    在IT行业中,ActiveX控件是一种在Windows操作系统中广泛使用的组件技术,主要应用于早期的互联网浏览器,如Internet Explorer。在本教程中,我们将探讨如何使用C#语言编写ActiveX控件,并实现与网页的交互,包括如何...

    IE加载未签名的ActiveX控件

    ### IE加载未签名的ActiveX控件解决方案 在IT领域,特别是Web开发和维护工作中,经常会遇到关于浏览器兼容性及安全策略的问题。其中,“IE加载未签名的ActiveX控件”是一个常见且令人头疼的问题。许多硬件设备配套...

    MFC制作ActiveX控件,解决了在实际使用中提示winocc.cpp出错的问题

    在本文中,我们将深入探讨如何使用Microsoft ...而面对"winocc.cpp"错误,我们需要理解其背后的原理,细心排查代码,调试运行环境,并积极寻求解决方案,以确保我们的ActiveX控件能够顺利地在各种环境中运行。

    C# 开发Activex控件

    在“应用程序”选项卡中,将目标框架设置为.NET Framework 4.x或更低版本,因为ActiveX控件不支持.NET Core或.NET 5+。 2. **启用Com互操作性**:在项目属性的“生成”选项卡中,勾选“使此项目适合COM互操作”。 ...

    网页向ActiveX控件传递参数(C++ 的ocx)

    在网页中,通过JavaScript或者其他脚本语言与ActiveX控件交互,实现数据交换和特定任务的执行。本篇将详细讲解如何在网页中向C++编写的ActiveX控件传递参数。 一、ActiveX控件基础 1. ActiveX控件的创建:使用...

    vc控件在IE8中不能调试的解决办法

    ### vc控件在IE8中不能调试的解决办法 #### 问题背景 在使用Visual C++(VC)开发Web浏览器中的ActiveX控件时,可能会遇到一个常见的问题:即在Internet Explorer 8(IE8)中无法进行有效的调试。这个问题主要是...

    web截图activex控件

    Web截图ActiveX控件是一种专为网页设计的屏幕...总的来说,"web截图activex控件"提供了一种在网页环境下便捷截图的解决方案,但随着技术的发展,开发者和用户都需要考虑其安全性和兼容性问题,寻求更现代的替代方案。

    使用VS2008C_开发ActiveX控件

    在IT行业中,开发ActiveX控件是创建可嵌入到其他应用程序(如Web浏览器)中的自定义功能组件的重要方法。...尽管存在安全性和跨平台的问题,但在特定的应用场景下,ActiveX控件仍然是一种有效的解决方案。

    开发IE控件ActiveX(Delphi 打印控件

    通过Delphi和相关的工具,开发者可以创建出能够在网页中提供强大功能的ActiveX控件,如本文中的打印功能。尽管过程中可能遇到调试困难和文件大小的问题,但通过学习和实践,这些都可以得到解决。

    ActiveX控件打包成Cab置于网页中自动下载安装

    4. 浏览器兼容性:由于非IE浏览器不支持ActiveX,因此需在代码中检测用户浏览器类型,针对不同浏览器提供相应的解决方案。 五、安全和风险 尽管CAB文件和ActiveX控件提供了便捷的部署方式,但也存在安全隐患。恶意...

    [资源分享]解决Win10下IE浏览器树形控件treeview无法显示的问题

    这可能是由于多种原因引起的,包括但不限于浏览器兼容性问题、JavaScript或CSS错误、ActiveX控件禁用等。本文将深入探讨这个问题,并提供解决方案。 树形控件(TreeView)是一种常见的用户界面元素,它以层级结构...

Global site tag (gtag.js) - Google Analytics