您的位置:首页 > 其它

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

2018-03-31 10:22 190 查看
用 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 不亡没有天理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: