gpt4 book ai didi

c++ - 当有许多函数要导入时替代 `LoadPackagedLibrary`

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:06 25 4
gpt4 key购买 nike

我知道如何使用 LoadPackagedLibrary 将外部模块(DLL)加载到 UWP 应用程序。问题是我有许多具有不同签名的函数。有没有更简单的方法将函数导入应用程序,就像在 C++ 中使用头文件一样?

最佳答案

由于您有 .lib 和头文件,因此创建 C++/WinRT 包装器组件可以相对容易地公开库中的所有特性(函数)。假设您有 test.lib 库和简单的头文件 test.h,例如:

#pragma once

int add(int a, int b);

您应该执行以下操作:

  1. 安装 C++/WinRT VS extension ;
  2. 创建“Windows 运行时组件 (C++/WinRT)”项目。请注意,此项目类型来自第一步的扩展。您不应使用默认情况下在 VS 中的“Windows 运行时组件(通用 Windows)”项目类型。将项目命名为 TestWrapper;
  3. 打开项目属性窗口(在解决方案资源管理器中右键单击项目 -> “属性”),导航到 C/C++ -> 常规 -> 附加包含目录,并添加包含头文件的目录路径(测试.h);
  4. 在同一个属性窗口中导航到 Linker -> Input -> Additional dependencies,并添加 test.lib 文件路径;
  5. 将新的 MIDL 文件添加到项目中(右键单击 -> 添加... -> 新项目... -> C++ -> 代码 -> Midl 文件 (.idl),并将文件命名为 Test。 idl. 添加如下内容:
namespace TestWrapper
{
[default_interface]
runtimeclass Test
{
Test();
static Int32 Add(Int32 a, Int32 b);
}
}
  1. 添加新的Test.h头文件,内容如下:
#pragma once

#include "Test.g.h"

namespace winrt::TestWrapper::implementation
{
struct Test: TestT<Test>
{
Test() = default;

static int32_t Add(int32_t a, int32_t b);
};
}

namespace winrt::TestWrapper::factory_implementation
{
struct Test : TestT<Test, implementation::Test>
{
};
}

  1. 添加新的 Test.cpp 文件,内容如下:
#include "pch.h"
#include "Test.h"
// if the original test.lib is C library you need to include
// the header file in the following way:
extern "C" {
#include "test.h"
}

namespace winrt::TestWrapper::implementation
{
int32_t Test::Add(int32_t a, int32_t b)
{
// We are calling the original library method to get the result:
return add(a, b);
}
}

最后,您可以从使用任何语言(即 JavaScript)编写的任何 UWP 应用中引用生成的组件。以下是从 C# 调用该方法的方法:

using TestWrapper;

class MyClass
{
void SomeMethod()
{
var sum = Test.Add(2, 3);
}
}

这里我将 Test.Add 实现为静态方法,但它也可以作为实例方法实现...

希望对您有所帮助。

关于c++ - 当有许多函数要导入时替代 `LoadPackagedLibrary`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46611679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com