如何在 Win32 桌面应用程序中使用自定义 WinRT 库?
How to use a custom WinRT library in a Win32 desktop app?
我的基于 Win32 的桌面应用程序中有一个 WinRT class(C++/CX 参考 class)。它访问 WinRT API 并且工作正常。我用 this guide 让它工作。现在我试图将此 class 放入桌面应用程序可以使用的库中。我在这方面遇到了很多麻烦。这是我在 Visual Studio 2013 年所做的事情:
- 通过选择 Installed > Templates> Visual C++ > Store Apps > Windows Apps > DLL (Windows).[=28 创建了一个新项目=]
- 将这个新的 DLL 项目添加到包含我的桌面应用程序的解决方案中。
- 添加了对 DLL 项目的引用
- 在配置属性 > C/C++ > 常规 > 附加#using 目录 中,我添加了 DLL 项目构建 .winmd 文件的目录。
- 在桌面应用程序的 .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();
}
Intellisense 工作,我编写了代码来实例化库中的 class。桌面应用程序构建,但当它运行时我得到:
First-chance exception at 0x76494598 in MyDesktopApp.exe: Microsoft C++ exception: Platform::ClassNotRegisteredException ^ at memory location 0x00A8F99C.
这是怎么回事?这是正确的方法吗?
截至 2019 年 7 月 26 日的更新:请参阅以下线程中 "Adam Braden - MSFT" 的评论。
这是不可能的。为了让应用程序使用自定义 WinRT 组件,该组件首先需要 "registered"。对于打包的 (AppX) 应用程序,这是通过将一些信息添加到包的 AppXManifest.xml 中来完成的。但是对于常规的 Win32 桌面应用程序,现在可以进行此类注册。您可以直接调用 OS 提供的 WinRT API,但不能写入您自己的自定义 WinRT API 以供其他应用程序使用。
我的基于 Win32 的桌面应用程序中有一个 WinRT class(C++/CX 参考 class)。它访问 WinRT API 并且工作正常。我用 this guide 让它工作。现在我试图将此 class 放入桌面应用程序可以使用的库中。我在这方面遇到了很多麻烦。这是我在 Visual Studio 2013 年所做的事情:
- 通过选择 Installed > Templates> Visual C++ > Store Apps > Windows Apps > DLL (Windows).[=28 创建了一个新项目=]
- 将这个新的 DLL 项目添加到包含我的桌面应用程序的解决方案中。
- 添加了对 DLL 项目的引用
- 在配置属性 > C/C++ > 常规 > 附加#using 目录 中,我添加了 DLL 项目构建 .winmd 文件的目录。
- 在桌面应用程序的 .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();
}
Intellisense 工作,我编写了代码来实例化库中的 class。桌面应用程序构建,但当它运行时我得到:
First-chance exception at 0x76494598 in MyDesktopApp.exe: Microsoft C++ exception: Platform::ClassNotRegisteredException ^ at memory location 0x00A8F99C.
这是怎么回事?这是正确的方法吗?
截至 2019 年 7 月 26 日的更新:请参阅以下线程中 "Adam Braden - MSFT" 的评论。
这是不可能的。为了让应用程序使用自定义 WinRT 组件,该组件首先需要 "registered"。对于打包的 (AppX) 应用程序,这是通过将一些信息添加到包的 AppXManifest.xml 中来完成的。但是对于常规的 Win32 桌面应用程序,现在可以进行此类注册。您可以直接调用 OS 提供的 WinRT API,但不能写入您自己的自定义 WinRT API 以供其他应用程序使用。