关于安全的ActiveX控件的编写,纠正大家一点错误,包括MSDN上也有问题

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 yang79tao 的 blog

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

本文关键:关于安全的ActiveX控件的编写,纠正大家一点错误,包括MSDN上也有问题
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top