原文地址:kennykerr.ca/2019/06/19/…
原文作者:kennykerr.ca/
发布时间:2019年6月19日
我一直很喜欢像Sysinternals这样的工具,因为它有一个单一的可执行文件,你可以简单地复制到你的开发盒上并运行。不需要安装程序或精心管理的DLL树。它只是工作。cppwinrt.exe也是这样的。从一开始,你可以简单地将它复制到任何Windows 10机器上,它就会工作。不过,总是有改进的空间。请看一下dumpbin报告的cppwinrt第1版的依赖关系。
> dumpbin /dependents cppwinrt.exe
ADVAPI32.dll
SHELL32.dll
api-ms-win-core-file-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-0.dll。
XmlLite.dll
api-ms-win-core-libraryloader-l1-2-0.dll。
api-ms-win-core-processenvironment-l1-1-0.dll。
RoMetadata.dll
SHLWAPI.dll
KERNEL32.dll
api-ms-win-core-rtlsupport-l1-1-0.dll。
api-ms-win-core-heap-l1-1-0.dll
api-ms-win-core-localization-l1-2-0.dll。
api-ms-win-core-timezon-l1-1-0.dll。
api-ms-win-core-console-l1-1-0.dll
OLEAUT32.dll
api-ms-win-core-winrt-error-l1-1-0.dll
api-ms-win-core-winrt-error-l1-1-1.dll
api-ms-win-core-winrt-l1-1-0.dll
api-ms-win-core-winrt-string-l1-1-0.dll。
api-ms-win-core-synch-l1-1-0.dll
api-ms-win-core-threadpool-l1-2-0.dll。
api-ms-win-core-com-l1-1-0.dll
api-ms-win-core-com-l1-1-1.dll
api-ms-win-core-synch-l1-2-0.dll
在我看来,这并不像看起来那么糟糕。所有这些DLL都是Windows 10自带的,那些api-ms-win-core-xxx条目确实是支持API集的转发DLL。不过,在那个列表中,还是有一个DLL引起了一点麻烦。RoMetadata.dll提供了操作系统附带的元数据解析器的实现。这几乎是每个人都直接或间接使用的实现。我们首先遇到了一个麻烦,因为微软的构建工程师想要使用的相当锁定的服务器SKU并不包括这个DLL。结果发现这是一个Windows设置的bug,但它让我对依赖关系有了更多的思考。
通过C++/WinRT 2.0,我终于开始用标准的C++编写一个完全独立的元数据解析器,以避免这种依赖性,解决这个笨重的旧解析器的各种麻烦。团队中的几个人也加入了进来,这个解析器现在是我们所有现代工具的基础。然后,我还放弃了转发 DLLs,以至于 dumpbin 现在为 cppwinrt 的第 2 版报告了一组略小的依赖关系。
> dumpbin /dependents cppwinrt.exe
KERNEL32.dll
ADVAPI32.dll
XmlLite.dll
SHLWAPI.dll
有趣的是,所有这些DLL都是可用的,不仅在Windows 10上,而且一直到Windows 7,甚至Windows Vista。这意味着如果你碰巧有一些疯狂的老式构建服务器在运行Windows 7,那么你仍然可以运行cppwinrt来为你的项目生成C++头文件。而如果你真的想在Windows 7上运行C++/WinRT,你甚至也可以通过一些工作来实现。
今天的内容就到这里了。希望你喜欢使用C++/WinRT!