一个ActiveX 对VC 运行库的依赖以及相关部署问题

本文探讨了ActiveX组件在IE浏览器中的自动安装问题。作者详细记录了从开发到封装再到自动安装过程中遇到的各种难题及解决办法,包括如何处理依赖库文件、清单(manifest)文件的配置等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日编写了一个ActiveX,对其进行.cab封装,并作了签名,希望能通过IE自动安装。

前面的环节都很顺利,就在自动安装这里飞了很大周折。

 

为了减少依赖性,ActiveX的编制未使用MFC,而是用的ATL;同时,希望使用静态连接,而避免对VC runtime的依赖,可是无论如何设置build选项(使用的是Visual Studio 2005),也无法避免对 msvcr80.dll的依赖 (用depends.exe 检查可以知道)。

 

最后只好试图将msvcr80.dll打入.cab中一同部署,然而试验的结果却是无法自动安装、运行。

 

多方查找资料后得知,自从Windows XP,VS2005,引入了新的库文件依赖模式: 应用独立 (isolated) 和 并行装配 (side-by-side assembly),要求.exe 和 .dll必须有相应的 manifest 才能正确加载所依赖的dll,否则,即使正确的DLL存在(在当前目录、path中),
也不能正确加载。Windows XP可以优先利用外部的.manifest文件,而2003优先利用内嵌的清单。

 

检查VS 2005为我的ActiveX生成的.manifest文件发现竟然还有错误,声明同时依赖于两个版本的Microsoft.VC80.CRT。内容如下:

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

 

不知如何修改工程配置,只好手工编辑清单文件,并自行嵌入正确的清单myActiveXCtrl.dll.rev.manifest

mt /verbose /outputresource:"./Release/<myActiveXCtrl>.dll;#2" /manifest "./myActiveXCtrl.dll.rev.manifest"

 

这样的话,在已经安装VC Runtime的机器上可以正常运行,但是在没有安装VC Runtime的机器上依然不行。因为自己无法为MSVCR80.dll设置共享的安装目录(形如C:/WINDOWS/WinSxS/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd),以及Manifest文件(C:/WINDOWS/WinSxS/Manifests/

很长的文件名),还有策略文件(C:/WINDOWS/WinSxS/Policies/下很长的目录名)。

 

然后尝试在.inf中加入VC Runtime安装包的hook:

[Add.Code]   

...
MSVCR80.dll=MSVCR80.dll

 

[MSVCR80.dll]
file-win32-x86=thiscab
hook=mfc80installer

 


[mfc80installer]
file-win32-x86=thiscab
run=%EXTRACT_DIR%vcredist_x86.exe

 

还是不行,查看setupapi.log,根本没有执行安装包。

 

接着,尝试Microsoft介绍的所谓私有部署,修改 .inf文件,部署控件DLL和msvcr80.dll到windows/system32下。结果是目标环境确实拷贝了这两个文件,但结果还是失败。

然而觉得奇怪的是,如果将控件DLL和msvcr80.dll单独拷贝到目标机器的某个目录下,是可以成功运行的。

最后,尝试都部署在windows下,竟然成功了。怀疑私有部署DLL时,不能部署于windows/system32下。

 

参考:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值