我正在创建一个通用 Windows 应用程序,它使用一个动态库 (wkhtmltopdf),它似乎通过其 Qt 实现依赖于 comctl32.dll。现在,我可以在我的开发机器(Windows 10 Pro 1607 Build 14393.1770)上正常运行该应用程序,但是,在目标机器(Windows 10 Enterprise 2015 LTSB)上,我收到以下错误:
LdrpInitializeNode - 错误:DLL“C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478c\COMCTL32.dll”的初始化例程 67ABDD60 在 DLL_PROCESS_ATTACH 期间失败
运行应用程序时,我注意到我的开发机器有不同版本的这个库(5.82.14393.447)。我知道 comctl32.dll 6.0 是不可再分发的,但我没有看到 5.82 的相同评论。我仍然决定打包我的库版本并LoadPackagedLibrary
手动调用。这在我的开发机器上最终加载了两个版本(如 Visual Studio 模块窗口中所示);在我的目标机器上,它加载了“较新”版本,但仍尝试在 WinSxS 上加载该版本,但仍然发生故障:
LdrpPreprocessDllName - 信息:DLL COMCTL32.dll 被 SxS 重定向到 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478c\COMCTL32.dll
看来我只需要让 WinSxS不加载它的 ComCtl32.dll 版本,因为我通过用C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478c\COMCTL32.dll
我的库版本替换目标机器来破解。然而,这是不希望的。
有没有办法重新分发 ComCtl32.dll 的工作版本,这样它就不会尝试从 WinSxS 加载它?也许通过清单文件或在目标机器上运行 MSI?