如何在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++ 应用程序的最佳实践?

UWP 调用Win32 关机

通过c#UWP应用程序中的Win运行时组件的c ++ dll适用于Arm而不适用于x86 / x64

如何使用 UWP 应用程序的命令行参数启动 win32 exe?

如何避免阻塞(C++、Win32)

如何在 Visual C++ 2008 中将 MFC 应用程序项目添加到 Win32 应用程序项目