【发布时间】:2012-11-30 20:43:56
【问题描述】:
我们有一个 win32 桌面应用程序,它会收集机器上安装的应用程序列表。一般我们会去卸载hive来收集应用程序列表(类似于控制面板填充其添加/删除程序列表的方式)。对于 Windows 8 商店应用程序,这不再起作用,因为商店应用程序与桌面应用程序不同。我能够找到这个源代码 Enumerate app packages by user SID sample 。我在windows 8上测试过,效果很好。但是有一个问题。
我希望能够与 windows CRT 静态链接,因此我不需要将 CRT 与这个简单的 exe 一起分发(我不能假设所需的 CRT 会安装在客户的机器上,而且我们的夜间构建环境是仍然是 VS2005,这只能在开发人员机器上构建,因此 CRT 版本可以作为 VS 更新或 Windows 更新的一部分进行更新,这将导致 CRT 版本高于客户机器上的版本)。我们当前的解决方案将发布 CRT 版本,我们的代码构建为私有的并行程序集(在 VS2005 上)。但是在 Windows 8 上使用 WinRT,我无法再静态链接 CRT 库(旧的 CLI/C++ 实际上有相同的限制)。
示例代码使用 Windows 8 (WinRT) 中的 PackageManager new。只是想知道是否有其他方法可以在没有 WinRT 的情况下获取此信息。我的直觉是不会,但问起来也无妨。
顺便说一句,我注意到的一件事是,在 VS 2012 上构建的 exe 的嵌入式清单根本没有 CRT 的dependentAssembly,就像我在 VS2005 上构建的 exe 一样,如下所示:
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
【问题讨论】:
-
我同意。您将需要 WinRT。
-
在dependency walker上做了一些运行和验证,它仍然需要3个dll:vccorlib110.dll、msvcp110.dll和msvcr110.dll,默认情况下,它没有安装在windows 8上。所以看起来像我们必须重新分发那些 dll,尽管我真的不想这样做。
标签: visual-c++ windows-8 windows-runtime