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 不亡没有天理。
采用 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 不亡没有天理。
相关文章推荐
- dubbo提供者打包,解决jar不能正常运行(不能注册到注册中心)
- CAB文件在客户端不能正常注册的讨论
- MSComm32.OCX不能正常注册的错误消息
- 安装包中DLL文件在WIN7下不能正常注册的解决方案
- vim markdown插件不能正常工作问题排查
- ocx控件注册信息丢失导致IE部分网站不能正常显示
- DISCUZ后台注册登录时验证码不能正常显示的解决方案
- 应用不能正常退出原因排查
- 解决VS2005,VS2008,VS2010无法正常加载项目问题,或者不能完全加载项目问题。。。
- iOS9 HTTP 不能正常使用的解决办法
- win7系统下 OpenGL 不能正常显示解决方法
- [致歉]8:50-9:20不能正常访问博客园及原因
- UEditor 请求后台配置项http错误,上传功能将不能正常使用!
- 本地控件不能正常加载也会导致VSS不能正常得到最新版本
- ubuntu下vi不能正常使用的解决方法
- Hadoop DataNode不能正常工作的原因
- node-readability不能正常工作
- 终于解决了不能正常引用cdoexm.dll的问题。
- 解决QQ在win7自动隐藏后不能正常滑动的方法(鼠标指向不能正常弹出,只弹出部分)
- 解决glide不能正常设置tag,以及listview子item的索引