|
首先要说的是什么叫安全组件,有些人认为安全组件就是毫无查觉的让IE下载并安装组件,这一点 微软恐怕也做不到,除非留后门(无耻的降低IE安全级别的方法除外),安全组件是指注册后,在 IE中运行不会提示说“本页中有ActiveX控件,是否运行”类似的提示(通过降低IE安全性也可以使 未注册安全的控件不弹出提示框,但显然要求不太合理),与下载控件无关,下载控件的时候涉及 到的是数字签名,不属于本话题。 关于安全组件,msdn2003下的路径为: ms-help://MS.MSDNQTR.2003FEB.2052/activex/workshop/components/activex/safety.htm msdn6.0下的路径为: MSDN98\98VC\2052\ActiveX.Chm::/inet401/help/compdev/controls/safety.htm 注:vc6.0下请使用后面地址提供的方法,用前面地址提供的方法将缺少头文件,他们原理完全一样。 在vckbase上也有类似的文章,比如《编写在游览器中不弹出警告的ActiveX的控件》,也是完全照 抄msdn上的,加了几个中文注释罢了。 下面进入主题,说说他们共同的缺点,毛病出在下面的函数中: STDAPI DllUnregisterServer(void) { HRESULT hr; // HResult used by Safety Functions AFX_MANAGE_STATE(_afxModuleAddrThis); if (!AfxOleUnregisterTypeLib(_tlid)) return ResultFromScode(SELFREG_E_TYPELIB); if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE)) return ResultFromScode(SELFREG_E_CLASS); // 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; return NOERROR; } 它犯了一个逻辑错误,我先说说错误的表现:当用regsvr32 /u 进行反注册时,将弹出 错误提示:调用某某ocx文件的DllUnregisterServer函数出错,错误代码:0x80070002, 用Error lookup工具查看,错误描述为:系统找不到指定的文件。 错误非常奇怪,让人摸不着头脑,看看注册表,其实反注册是成功的,所以我说msdn中这个问题 只是一个小失误,并不算是错误。 下面说一下错误的原因,安全组件其实是在注册表中添加一些注册,表明自己安全罢了,关于安全 性的注册是依赖与原组件的,所以上面函数反注册的顺序不正确,应该先反注册掉安全组件,再 反注册掉原组件,修改后的代码如下: STDAPI DllUnregisterServer(void) { AFX_MANAGE_STATE(_afxModuleAddrThis); // Remove entries from the registry. HRESULT hr; // return for safety functions hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing); if (SUCCEEDED(hr)) hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting); if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor)) return ResultFromScode(SELFREG_E_TYPELIB); if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE)) return ResultFromScode(SELFREG_E_CLASS); return hr; } 问题解决!
|