如何在win32 C++控制台应用程序中调用uwp类库
Posted
技术标签:
【中文标题】如何在win32 C++控制台应用程序中调用uwp类库【英文标题】:how to call uwp class library in win32 C++ console application 【发布时间】:2020-06-22 01:48:14 【问题描述】:我想在 win32 C++ 控制台应用程序中使用 Uri 调用 uwp 应用程序。我想到的第一件事是使用 LaunchUriAsync,但我在 win32 C++ 中找不到 Windows.System.Launcher.LaunchUriAsync。所以我想创建一个 uwp 类库来调用 LaunchUriAsync 和 win32 调用这个库。我找到了一个示例,现在我可以成功加载库,但 GetProcAddress 始终返回 null。不确定在win32控制台中调用uwp类库是否可行。请帮帮我。该项目位于https://github.com/vincent1000/win32CallUwpLibrary 代码很简单:
UWP 经典库:
namespace ExportedCodeSolution
public class Class1
[DllExport(ExportName = "callUri", CallingConvention = CallingConvention.StdCall)]
static public async void callUri()
Console.WriteLine("call URI start");
await Launcher.LaunchUriAsync(new Uri("www.bing.com"));
和 Win32 控制台:
using CallUriFn = void(__stdcall*) ();
int main()
HMODULE mod = LoadLibraryA("ExportedCodeSolution.dll");
CallUriFn fn = reinterpret_cast<CallUriFn>(GetProcAddress(mod, "callUri"));
fn();
另外,还有其他方法可以在 win32 中调用 LaunchUriAsync 吗?我已经搜索了一些方法,但没有一个适合我。
【问题讨论】:
如果这会起作用(不确定是否可以),您将需要使用 __declspec(dllexport) 导出函数,就像从任何普通的本机 DLL 中一样,该函数将转发到静态 CallURI 方法.本机端对 DllExport 属性一无所知。 【参考方案1】:解决方案很简单:只需从您的控制台应用程序调用Launcher.LaunchUriAsync。最简单的方法是使用C++/WinRT。假设您使用安装了C++/WinRT extension 的 Visual Studio,创建一个“Windows 控制台应用程序 (C++/WinRT)”,并将向导生成的代码替换为:
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.System.h>
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::System;
int main()
init_apartment();
Uri uri(L"www.bing.com");
Launcher::LaunchUriAsync(uri).get();
这将编译,但在运行时失败,因为 "www.bing.com"
不是有效的 URI。这需要替换为有效的 URI(例如 "https://www.bing.com"
)。
【讨论】:
以上是关于如何在win32 C++控制台应用程序中调用uwp类库的主要内容,如果未能解决你的问题,请参考以下文章
使用 Win32 和 UWP/Xbox 平台支持管理 C++ 应用程序的最佳实践?
通过c#UWP应用程序中的Win运行时组件的c ++ dll适用于Arm而不适用于x86 / x64