如何在 Win32 桌面应用程序中使用自定义 WinRT 库?

Ben*_*n H 5 dll windows-8 windows-runtime c++-cx

我的基于 Win32 的桌面应用程序中有一个 WinRT 类(C++/CX 引用类)。它访问 WinRT API 并且工作得很好。我使用本指南来让它工作。现在我试图将此类放入桌面应用程序可以使用的库中。我在这方面遇到了一些麻烦。这是我在 Visual Studio 2013 中所做的:

  1. 通过选择“已安装”>“模板”>“Visual C++”>“商店应用程序”>“Windows 应用程序”>“DLL (Windows)”创建了一个新项目。
  2. 将此新的 DLL 项目添加到包含我的桌面应用程序的解决方案中。
  3. 添加了对 DLL 项目的引用
  4. “配置属性”>“C/C++”>“常规”>“其他 #using 目录”中,我添加了 DLL 项目构建 .winmd 文件的目录。
  5. 在桌面应用程序的 .cpp 文件中,我添加了:
#using <MyLib.winmd>
#using <Windows.winmd>
#using <Platform.winmd>

[MTAThread] // initializes WinRT runtime
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow) {
    MyWinRTClass^ myObject = ref new MyWinRTClass();
}
Run Code Online (Sandbox Code Playgroud)

智能感知可以工作,我编写了代码来实例化库中的类。桌面应用程序已构建,但当它运行时我得到:

MyDesktopApp.exe 中 0x76494598 处的首次机会异常:Microsoft C++ 异常:Platform::ClassNotRegisteredException ^ 位于内存位置 0x00A8F99C。

这是怎么回事?这是正确的方法吗?

Ram*_*rma 4

截至 2019 年 7 月 26 日更新:请参阅以下帖子中“Adam Braden - MSFT”的评论。

这不可能。为了让应用程序使用自定义 WinRT 组件,需要首先“注册”该组件。对于打包 (AppX) 应用程序,这是通过将一些信息添加到包的 AppXManifest.xml 中来完成的。但是,对于常规 Win32 桌面应用程序,现在可以进行此类注册。您可以直接调用操作系统提供的 WinRT API,但无法写入自己的自定义 WinRT API 以供其他应用程序使用。

  • 这可以通过编写[免注册COM激活](https://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic6)的清单文件来实现吗?我需要相同的“功能”来使用 winrt 库进行一些批处理...... (2认同)
  • (1) 从 Fall Creators Update (1709) 版本 16299 开始,Desktop Bridge 支持调用第 3 方 WinRT 组件。使用 Windows 应用程序打包项目来打包应用程序。更多信息请点击此处 https://blogs.windows.com/windowsdeveloper/2017/07/06/calling-winrt-components-win32-process-via-desktop-bridge 和此处 https://learn.microsoft.com/en-我们/windows/msix/desktop/桌面到uwp-packaging-dot-net (2认同)
  • 另外 (2) 自 2019 年 5 月更新 (1903) 版本 18362 起,如果无法打包应用程序,可以使用注册免费 WinRT,请参阅 https://blogs.windows.com/windowsdeveloper/2019/04/30/enhancing-非打包桌面应用程序使用 Windows 运行时组件/ (2认同)