visual-c++ - 如何确定在 Windows 应用商店/通用应用程序中无法加载哪个 Dll 依赖项?

标签 visual-c++ dll windows-store-apps win-universal-app native

运行我正在处理的 UWP 项目时,我收到以下对话框。

“无法激活 Windows 应用商店应用程序‘MyAppsMangledName’。‘MyExeName’进程已启动,但激活请求失败并出现错误‘应用程序未启动’。”

Visual Studio 输出具有以下内容。

线程 0x3d4c 已退出,代码为 -1073741515 (0xc0000135)。
线程 0x3b50 已退出,代码为 -1073741515 (0xc0000135)。
程序“MyExeName”已退出,代码为 -1073741515 (0xc0000135)“未找到依赖的 dll”。

事件查看器有 3 个事件,它们基本上以 3 种不同的方式重述弹出对话框,仅此而已。

在启动期间运行进程监视器向我显示许多 dll 已成功加载,但除了一些 NAMENOTFOUND 事件之外没有任何指示失败,不幸的是这些事件没有显示找不到什么名称。

在 Win32 中,一个有用的对话框通常会指示无法加载哪个 dll。当然,对于 .Net 应用程序,融合日志可以非常直接地进行跟踪。但对于 Store/UWP 应用程序,我似乎找不到追踪违规依赖项的好方法。

最佳答案

这对我正在从事的项目也产生了影响。经过大量挖掘,我团队中的某个人能够弄清楚。所以我想我会分享给其他在同样问题上苦苦挣扎的人。

我们正在使用 VS2015 使用 C++ 进行 UWP。因此,考虑到这一点,有一个名为 gflags 的程序位于 C:\program Files (x86)\Windows Kits 10\Debuggers\x64\gflags.exe

所以你需要一个带有管理员的 cmd 窗口,然后运行命令 gflags.exe -i your-program-name.exe +sls

注意:gflags 不在我的路径中,因此请在执行命令之前添加路径或导航到它所在的位置。

只需传入不带目录的 exe 名称即可。它所做的是为 VS 设置一个注册表设置,该设置打开 sls(显示加载程序快照)以使 exe 匹配该名称。然后在 VS 中运行您的应用程序,您将获得大量 dll 加载信息,包括无法在输出窗口中加载的 dll 的名称。在我们的例子中是这样的:

5038:34f4 @ 789320468 - LdrpProcessWork - 错误:无法加载 DLL:“vccorlib140d_app.DLL”,父模块:“E:\projects---\Source\Builds\vs2015_Debug_UWP_x64\AppX---.exe”,状态:0xc0000135

另一种更快的测试方法(YMMV)是将输出与另一个有效的构建配置进行比较。在我们的例子中,我们可以很好地运行发布版本,但调试版本是 barf。发布输出显示 vccorlib140_app.dll 在调试丢失时加载。

关于visual-c++ - 如何确定在 Windows 应用商店/通用应用程序中无法加载哪个 Dll 依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36315538/

相关文章:

java - 从 java 调试一个 dll java->jni.dll ->app.dll -> app.dll

c++ - 从注入(inject)进程的 DLL 调用函数并更改指针函数的地址

.net - 如何访问Windows.Management.Deployment命名空间?

windows-8 - 当包含在具有 ScrollViewer(例如 FlipView)的控件中时,被 VKB 遮挡的 Windows 8 自动滚动聚焦文本框被禁用

c++ - 模板代码上的编译器堆栈溢出

C++ 用户自定义类型转换失败

visual-c++ - native c++ dll 如何检测它何时在 Windows 应用商店应用程序中运行

c++ - 如何在vc++中拆分字符串?

c++ - "/MD/MT "和 "dll lib"之间的概念歧义

windows-runtime - 如何在 WinRT 上重复使用弹出菜单