首先要说的是什么叫安全组件,有些人认为安全组件就是毫无查觉的让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;
}
问题解决!