关于在VS环境开发ActiveX控件不能在部分win10或者win8电脑上注册的解决方案

2018-02-05 10:38:38来源:oschina作者:我的代码不生虫人点击

分享
问题描述:

VS2008上利用ATL(动态模板库)编写的项目ActiveX控件在部分电脑上可成功注册并运行,但部分电脑上无法注册特别是Win10环境上。


目标:

在Win7、Win8、Win10等环境下成功注册ActiveX控件。


解决方案:

通过对问题的分析,可以发现部分电脑是可以注册的,为什么部分不可以?通过了解后发现能注册的电脑是安装过VS或者安装某些软件时候自动安装了VS运行环境,那么问题可能就是这个。然后针对这个问题进行了三种方案的研究,两种方案验证可行,那么总结出问题就是运行环境问题导致不能注册,下边分别说明和比较:


方案一(存在问题)

既然项目依赖运行库,那么其它插件为什么不需要运行库,因此首先针对项目进行了研究。发现项目编译生成dll文件时,采用的是动态链接运行库文件,因此修改编译属性为静态链接后重新编译运行项目,注册成功。


属性修改方法:项目属性-》配置属性修改“C/C++/Code Generation” -》运行时库,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。

/MD和/MDd:动态链接库文件,/MD为release版本,/MDd为debug版本。


/MT和/MTd:静态链接库文件,/MT为release版本,/MTd为debug版本。

结论:


经过和项目负责人确认之后,生产项目必须依赖其它的运行库环境,因此采用静态链接直接导致项目编译通过不了。因此此方案针对独立的ATL项目有效,需要链接库文件项目不可用。


方案二(可行)

由于不能采用静态编译解决问题,因此采用物理方式,直接安装VS运行库,然后项目注册成功。

结论:


经过和项目负责人确认之后,改项目需要自动下载和注册,因此如果采用安装运行库的方式虽然可以实现所有电脑正常注册,但是不能自动执行,需要用户手动安装VS运行环境,比较繁琐。但是在没有可选方案前提下,也只能采用此方案。


方案三(最佳)

既然安装VS运行库可以注册成功,那么项目运行需要用到哪些库文件呢?直接将VS环境的运行库拷贝到项目下是否可以正常运行?通过对项目文件反编译进行分析之后,发现该项目依赖VS环境中的几个运行库位置如下:


D:/Microsoft Visual Studio 9.0/VC/redist/Debug_NonRedistx86/Microsoft.VC90.DebugCRT 下的下列文件:


Msvcm90d.dll


Msvcp90d.dll


Msvcr90d.dll


Microsoft.VC90.DebugCRT.manifest


将这四个文件拷贝到运行程序同一文件夹下,然后运行项目,注册成功。


但是在新装操作系统中注册出现了问题,经过控制台提示使用skstrace.exe工具进行了日志分析,提示缺少ATL90.dll运行库,一般程序都自己封装了ATL90.dll运行库,因此下载了之后发现一样出现问题。分析之后原来是版本不对,需要采用反编译之后文件中依赖的版本。


将正确的版本拿过来后还是不行,经过分析是因为系统到c:/windows/winsxs扫描manifest文件找不到该运行库,所以我们需要将开发工具manifest文件放到项目下,系统盘找不到时会扫描全盘的manifest文件,然后找到该运行库。需要运行库:


D:/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.ATL下的下列文件:


ATL90.dll


Microsoft.VC90.ATL.manifest

结论:


由于该方案最接近原始项目,自动依赖拷贝的运行库文件,不需要手动安装运行环境,并且可以实现各个windows版本注册,且可以发布后自动注册,达到我们的问题解决目标。因此该方案是该问题处理的最佳方案。

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台