【问题标题】:How to use structs from a dll in c++?如何在 C++ 中使用来自 dll 的结构?
【发布时间】:2012-09-25 16:27:10
【问题描述】:

我有一个第三方 dll,没有可在我的 c++ 应用程序中使用的 lib 或头文件。这就是我使用 LoadLibrary(_T("xxx.dll")) 加载它的原因。我可以使用 GetProcAddress() 函数来实现它的功能。

这个 dll 中有一个结构,我也必须访问它。我应该怎么做才能到达和使用它?我查看了该站点,但只找到了 c# 而不是 c++ 的示例。在c++中这样做的方式是什么?

谢谢...

【问题讨论】:

  • 结构,你是指定义还是实例化?无论如何,您无法从 DLL 访问结构的数据布局,您需要原始定义。
  • 不清楚“这个 dll 中的结构”是什么意思。 DLL 不包含结构,它们包含函数和数据,而不是类型。

标签: c++ visual-c++ dll struct


【解决方案1】:

简答: 您可以使用 GetProcAddress 检索声明为结构的变量的地址。来自the GetProcAddress man page

从指定的动态链接库 (DLL) 中检索导出函数或变量的地址。

该函数的名称应该是 GetSymAddress 而不是 GetProcAddress,但我离题了。

长答案:

假设 DLL 包含结构 Foo 类型的符号 instance

typedef struct { int x; int array[100]; } Foo;
__declspec( dllexport )  struct Foo Bar = 
{
0xdeadbeef,{0}
};

可以检索变量 Bar 的地址,前提是您已经加载了 dll 并在某处拥有它的 hModule 句柄:

struct Foo* Bar = GetProcAddress(hModule,"Bar");

无法检索结构本身的定义,但无论如何我认为这不是您的意思。

注意:我忽略了名称修饰、extern "C" 声明以及可能需要考虑的其他一些事情,以便清楚地说明这一点,我假设读者已经对手头的主题有基本的了解。

【讨论】:

    【解决方案2】:

    如果您知道结构的语法,例如来自 C# 定义,那么您可以简单地将其定义添加到 .h 文件中,将其包含在您的 C++ 源文件中并使用它。就这样。 但如果你的结构是某种类并且有成员方法,那么你应该知道成员方法的修饰名称,从 .dll 动态加载它们并将它们作为 C 函数调用。

    【讨论】:

    • 注意内存对齐如果这个DLL是用不同的内存对齐方式编译的,你可以使用#pragma push和#pragma pop来覆盖你要定义的新结构,强制它使用相同的结构内存对齐也是。祝你好运
    • 我知道结构的语法,它没有成员方法。那么我可以用相同的语法编写一个结构并使用它吗?
    • 所以假设dll中的结构是这样的:typedef struct { int x; int array[100]; } Foo;我会在c++端定义相同的并使用它吗?
    • @rendar:如果您的代码中需要这样的结构,那么您应该定义一个。如果没有,不要。很难理解你的问题,因为你没有真正解释清楚。
    • @DavidSchwartz:我尝试做的是这个。 dll中有一个函数,该函数采用同样在dll中定义的结构类型的参数。我必须调用该函数,但我不知道如何以该结构类型传递参数。因为我不知道如何获得那种类型。我在问是否可以在我的应用程序中定义相同的结构并将参数从该结构类型传递给函数?
    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 2023-03-17
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多