相声演员董建春的资料:ActiveX控件在IE中不能显示的解决方案 - 镜花水月 - JavaEye技术网站

来源:百度文库 编辑:中财网 时间:2024/04/28 14:50:08

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实现文件中包括两个文件:

 

Cpp代码
  1. #include     
  2. #include     
  3. // 本控件的CLSID,注册表用    
  4. const GUID CDECL CLSID_SafeItem ={ 0x12342234, 0x3234, 0x4234,    
  5.                       { 0x52,0x34,0x62,0x34,0x72,0x34,0x82,0x34 } };    
  6. // 版本控制    
  7. const WORD _wVerMajor = 1;    
  8. // 次版本号    
  9. const WORD _wVerMinor = 0;    
  10. 实现    
  11. // CTestApp::InitInstance - DLL initialization    
  12. BOOL CTestApp::InitInstance() {    
  13.     return COleControlModule::InitInstance();    
  14. }    
  15. // CTestApp::ExitInstance - DLL termination    
  16. int CTestApp::ExitInstance() {    
  17.     return COleControlModule::ExitInstance();    
  18. }    
  19. // 创建组件种类    
  20. HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription) {    
  21.     ICatRegister* pcr = NULL ;    
  22.     HRESULT hr = S_OK ;    
  23.     hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    
  24.     if (FAILED(hr)) return hr;    
  25.     // Make sure the HKCR\Component Categories\{..catid...}    
  26.     // key is registered.    
  27.     CATEGORYINFO catinfo;    
  28.     catinfo.catid = catid;    
  29.     catinfo.lcid = 0x0409 ; // english    
  30.     // Make sure the provided description is not too long.    
  31.     // Only copy the first 127 characters if it is.    
  32.     int len = wcslen(catDescription);    
  33.     if (len>127) len = 127;    
  34.     wcsncpy(catinfo.szDescription, catDescription, len);    
  35.     // Make sure the description is null terminated.    
  36.     catinfo.szDescription[len] = ’\0’;    
  37.     hr = pcr->RegisterCategories(1, &catinfo);    
  38.     pcr->Release();    
  39.     return hr;    
  40. }    
  41. // 注册组件种类    
  42. HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid) {    
  43.     // Register your component categories information.    
  44.     ICatRegister* pcr = NULL ;    
  45.     HRESULT hr = S_OK ;    
  46.     hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    
  47.     if (SUCCEEDED(hr)) {    
  48.       // Register this category as being "implemented" by the class.    
  49.       CATID rgcatid[1];    
  50.       rgcatid[0] = catid;    
  51.       hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);    
  52.     }    
  53.     if (pcr != NULL) pcr->Release();    
  54.     return hr;    
  55. }    
  56. // 卸载组件种类    
  57. HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid) {    
  58.     ICatRegister* pcr = NULL ;    
  59.     HRESULT hr = S_OK ;    
  60.     hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,    
  61.             NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);    
  62.     if (SUCCEEDED(hr)) {    
  63.       // Unregister this category as being "implemented" by the class.    
  64.       CATID rgcatid[1] ;    
  65.       rgcatid[0] = catid;    
  66.       hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);    
  67.     }    
  68.     if (pcr != NULL) pcr->Release();    
  69.     return hr;    
  70. }    
  71. // DllRegisterServer - Adds entries to the system registry    
  72. STDAPI DllRegisterServer(void) {    
  73.     HRESULT hr;    
  74.     AFX_MANAGE_STATE(_afxModuleAddrThis);    
  75.     if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))    
  76.         return ResultFromScode(SELFREG_E_TYPELIB);    
  77.     if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))    
  78.         return ResultFromScode(SELFREG_E_CLASS);    
  79.     // 标记控件初始化安全.    
  80.     // 创建初始化安全组件种类    
  81.     hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");    
  82.     if (FAILED(hr)) return hr;    
  83.     // 注册初始化安全    
  84.     hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);    
  85.     if (FAILED(hr)) return hr;    
  86.     // 标记控件脚本安全    
  87.     // 创建脚本安全组件种类    
  88.     hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");    
  89.     if (FAILED(hr)) return hr;    
  90.     // 注册脚本安全组件种类    
  91.     hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);    
  92.     if (FAILED(hr)) return hr;    
  93.     return NOERROR;    
  94. }    
  95. // DllUnregisterServer - Removes entries from the system registry    
  96. STDAPI DllUnregisterServer(void) {    
  97.     HRESULT hr;    
  98.     AFX_MANAGE_STATE(_afxModuleAddrThis);    
  99.     if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))    
  100.         return ResultFromScode(SELFREG_E_TYPELIB);    
  101.     if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))    
  102.         return ResultFromScode(SELFREG_E_CLASS);    
  103.     // 删除控件初始化安全入口.    
  104.     hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);    
  105.     if (FAILED(hr)) return hr;    
  106.     // 删除控件脚本安全入口    
  107.     hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);    
  108.     if (FAILED(hr)) return hr;    
  109.     return NOERROR;    
  110. }   

 

atl实现的ocx,在声明文件CTestCtl.h中:

Cpp代码
  1. class CTestCtl :    
  2.     .... ,    
  3.     public IObjectSafetyImpl    
  4. {    
  5. ...    
  6. BEGIN_COM_MAP(CTestCtl)    
  7. COM_INTERFACE_ENTRY(IObjectSafety)    
  8. END_COM_MAP()    
  9. ...    
  10. }   

 

或者:

Cpp代码
  1. BEGIN_CATEGORY_MAP(CTestCtl)       
  2. IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)       
  3. IMPLEMENTED_CATEGORY(CATID_SafeForScripting)       
  4. END_CATEGORY_MAP()  
不能解决“当前安全设置禁止运行该页的Activex控件.因此该页可能无法正常显示”问题 如何在html中响应ActiveX控件的事件 如何开发IE的插件(ActiveX控件) [求助]关于IE ActiveX 控件的问题 请问ActiveX控件是做什么的?在IE中可不可以禁用? activex控件显示问题 IE更新后的问题:如何自动激活网页中Activex控件 ActiveX控件被禁止,不能正常显示网页 IE中activeX的 问题? IE 里面下载的Activex控件和插件后保存在哪里 我登淘宝网的时候总是显示无法运行该页的ActiveX控件,而且我在IE里设置了启用控件,我用的事江民杀毒 在vb中如何控制listview控件中显示的内容不能变化 ActiveX控件的正确理解 ACTIVEX控件的问题 ActiveX控件的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ActiveX控件的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 求助我的2003系统activex控件在安全设置中禁止了 VB6 :如何在Activex控件中使用OLE 如何在word文档中嵌入ActiveX控件 C#中ListBox控件在其他窗口添加项不能显示的问题 在"联众"上,页面上显示"在此网页上的ActiveX控件和本页上其他部分交互是不可能的,你允许吗?"如何解决? VB窗体中控件达到极限不能再创建更多的控件,请问怎么解决 我的电脑上网打开IE总是弹出:当前安全设置禁止运行该页中的ActiveX控件,因此,该页可能无法正常显示。 无法安装ActiveX控件,如何解决。