最近遇到一个让人头大的问题,在vs2022上使用Windows Installer打包的程序有个输出的dll需要注册com组件,在自己电脑上可以使用,但是给其他人使用就会报错 “未能注册模块 xxx.dll。HRESULT -2147024770。请与你的技术支持人员联系。”
由于是小白对这方面的知识几乎为零,所以只能在网上寻求方法或者相同的案例。最后从网上得出了以下结论:
1.缺少运行vs运行环境
如果是没有安装过vs的电脑,那么大概率会存在这个情况。在官网可以下载对应的环境或下载DirectX_repair软件 一键修复。
最新受支持的 Visual C++ 可再发行程序包下载 | Microsoft Learn
2.输出的dll文件缺少相关的依赖项
3.缺少管理员权限
4.关闭杀毒软件运行
5.dll文件版本问题,64位dll放在了32位操作系统的计算机上
我的排查过程:
将输出文件属性中的自动注册vsdrfcomselfreg改为标准vsdrfcom再打包msi,安装完msi之后以管理员权限启动cmd.exe去安装的路径下,输入regsvr32 dll文件名手动注册。结果显示如下:
如果是这种情况,那么大概率是缺少依赖项了, 启动vs自带的developer command prompt,输入指令dumpbin /dependents dll文件名。将缺少的依赖项添加上即可(系统自带的dll不需要加)。加上后再次使用regsvr32 dll文件名 手动注册,成功了。
将输出文件属性的注册改回自动注册vsdrfcomselfreg,重新打包msi。再次安装如果成功了,那么恭喜。但是我仍然是无法注册。启用developer command prompt,输入msiexec /i msi文件名 /l*v 输出的文件名.log(最好带路径不然又得到处找该文件)来查看安装细节。
导致我失败的其他原因:①代码中SetThreadDpiAwarenessContext函数不支持Windows 2012服务器。可以下载dependencies软件来查看报红dll中的函数是否适用于你电脑的操作系统。②检查打包的msi程序是否包含了发出类似'VERSION.dll' should be excluded because its source file 'C:\Windows\system32\VERSION.dll' is under Windows System File Protection.警告的系统dll,如果包含了,排除或者删除掉重新打包。
目前我遇到的就是这几个问题,希望能够帮助到萌新朋友们。如果都不能解决,但是可以使用regsvr32手动注册dll,那么还有一种折中的办法:注册属性改为vsdrfcom,然后写一个批处理指令在安装完msi包后去注册dll。再把msi和批处理文件打包成一个自解压exe,设置解压到临时路径,解压时启动批处理文件。(这个方法需要获取管理员权限才能注册dll成功)