我正在创建一个通用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.102440.1634_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_control_6595b64144ccf1df_5.82.102401.6384_none_49c02355cf03478c\COMCTL32.DLL
我似乎只需要让WinSxS不加载其版本的ComCtl32.dll,因为我用我的库版本替换了目标机器中的C:WindowsWinSxSx86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478cCOMCTL32.dll
。然而,这是不可取的。
有没有办法重新分发ComCtl32.dll的工作版本,这样它就不会试图从WinSxS加载它?也许是通过清单文件或在目标计算机上运行MSI?
Comctl32对于UWP根本不受支持。即使你设法让它"工作",它也可能在任何时间点中断——如果你在项目上运行Windows应用程序认证工具包(WACK),它会给你带来错误。
我确信Fusion(支持绑定到不同DLL版本的东西)也被禁用了。由于应用程序是自包含的,并且不像传统应用程序那样安装/共享系统库,因此不需要绑定重定向。