覆盖 UWP 中的 WinSxS 机制。专门针对 ComCtl32.dll

Posted

技术标签:

【中文标题】覆盖 UWP 中的 WinSxS 机制。专门针对 ComCtl32.dll【英文标题】:Override WinSxS mechanism in UWP. Specifically for ComCtl32.dll 【发布时间】:2017-11-07 18:46:03 【问题描述】:

我正在创建一个通用 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 not 加载它的 ComCtl32.dll 版本,因为我通过用我的库版本替换目标机器中的 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478c\COMCTL32.dll 来破解。然而,这是不希望的。

有没有办法重新分发 ComCtl32.dll 的工作版本,使其不会尝试从 WinSxS 加载它?也许通过清单文件或在目标机器上运行 MSI?

【问题讨论】:

【参考方案1】:

UWP根本不支持 Comctl32。即使您设法让它“工作”,它也可能在任何时候中断 - 如果您在项目上运行 Windows 应用程序认证工具包 (WACK),它会给您带来错误。

我很确定 UWP 也禁用了 Fusion(支持绑定到不同 DLL 版本的东西)。由于应用程序是自包含的,并且不会像旧版应用程序那样安装/共享系统库,因此不需要绑定重定向。

【讨论】:

感谢您的回复。当gflags 给我COMCTL32.dll was redirected to ... by SxS 时,我感到非常惊讶,而且我一直看到从我的应用程序包以外的文件夹加载的 DLL。一般来说,我“知道”UWP 不会使用包外部的 DLL,但我所看到的显示有 some 是;我只是在这一点上一无所知。另外,我认为我不应该担心 WACK,因为这是一个仅用于内部分发而不是 Store 的包,但我可能错了。 您不必将 WACK 传递给侧面加载,但任何失败都意味着您正在执行的操作不受支持,并且它可能随时通过 Windows 更新停止工作。如果您将应用程序作为业务工作流程的关键部分,那么如果应用程序突然无法运行,它可能会以失败告终。

以上是关于覆盖 UWP 中的 WinSxS 机制。专门针对 ComCtl32.dll的主要内容,如果未能解决你的问题,请参考以下文章

从代码绑定到 WinRT/UWP 中的自定义附加属性

[UWP]XAML中的响应式布局技术

在 UWP 类库中设置用户控件的样式并在使用应用程序中覆盖它

UWP StorageFile.CopyAsync() 引发错误:“值不在预期范围内。”

UWP (Windows 10) 应用程序提交失败

记UWP开发——多线程操作/并发操作中的坑