VS2017 DLL 不能正常注册 HRESULT -2147024703 排查

用 VS2017 Community 开发TSF输入法,开发环境是 Win10 X64。编译好的 DLL 在本机可以安装(注),但是在其他机器(Win8.1 X64,Win7 X64)上都报错: 无法注册模块 xxxx\xxx.dll。HRESULT -2147220473

采用 Dependency Walker 查看这个 DLL,发现几乎全部是红的(不完整)。

注:使用 Visual Studio Installer 新建一个 Setup Projection,然后添加 DLL 设置为 vsdrfCOMSelfReg. (方法源自微软开发实例,此处从略)

排查过程如下:

(1)工程-》属性-》配置项目-》常规-》目标平台,填写的是 Win10。可改为 Win8.1,但需要 VS2017 下载添加 Win8.1 SDK。从 VS->工具->获取工具和功能,可以添加 Win8.1 SDK。但是,如果选择从 “单个组件”添加 Win8.1 SDK,编译出错,缺少很多头文件,例如 ctype.h 等。经过试验,从“使用 C++ 的桌面开发”添加,就不会报错了,可以正常编译目标平台为 Win8.1 的 DLL。但这样仍然不能在 Win8.1 上注册。

(2)学习了一下 X86,X64,Win32。X86 是 32位 CPU,X64 是 64位 CPU/64位 系统。Win32 是 32位 系统。只有以下三种组合:X86+Win32,X64+Win32,X64。一个 32位 程序,是可能在 X64系统内运行的,一般会安装到 Program(x86) 目录下。这种程序是 32位 系统和 64位 系统通用的。试验了一下,Debug模式下编译了一个 Win32 DLL,在 X64 可以安装,也能出现在输入法列表里,但是无法启动中文模式。在 X64+Win32 也能安装,但是同样无法注册。错误代码: -2147024770. 强行安装,会在控制面板语言选项里看到一个不可用输入法。不能出现在输入法选择列表里。在 X64+Win32 Win8 里使用 Dependency Walker 查看该 DLL,发现大部分都正常了,只有少数几个红色。手动注册 regsvr32 XXX.dll 仍然失败。

(3)Win32 Release 开始报错:“LNK1112: 模块计算机类型“x86”与目标计算机类型“x64”冲突”,解决办法:在 工程-》属性-》配置项目-》链接-》高级-》目标计算机,改为 X86 就能通过。

(4)在安装文件制作程序-》属性-》TargetPlatform 那里可以选择是 X64/X86。对于按 X64 Release 的版本,此处如果选择 X86,在 Win32 和 X64 上都能安装,在 X64 上会给安装到 Program(X86) 里面。而如果此处选择 X64,那么只能在 X64 的电脑上安装,在 X86+Win32 的电脑上安装,会提示:此处理器类型不支持该安装程序包。关系就是这么乱,但是这么多年以来 Windows 各种生态一直很好地共存着。但是从一个开发者的角度,IDE 不能很好地做好软件和各平台的适配,总是缺这少那,频繁报错,只想说,Windows 不亡没有天理。


===========================================

后记:后来这个问题是这么解决的:

(1)在 Win7 上用 VS 2012 重新编译,这里会有报错若干,不过都能解决;

(2)改用 bat 文件代替 msi;

(3)在 x86(x86CPU+32bitOS)  x64(x64CPU+64bitOS) 上都能安装,但在 Win32(x86CPU+32bitOS) 上还不行。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值