如何从DLL中检索数组变量? (Visual C ++)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从DLL中检索数组变量? (Visual C ++)相关的知识,希望对你有一定的参考价值。

第三方C库包含以下全局变量和函数:

typedef RtBasis float[4][4];

RI_EXPORT RtBasis RiCatmullRomBasis;
RI_EXPORT void    RiBasis(RtBasis u);

我想从DLL中检索变量和函数,并在我的C ++代码中使用它们。当我执行以下操作时:

// Get the function.
void (*RiBasis)(RtBasis);
RiBasis = (void (*)(RtBasis))GetProcAddress(h, "RiBasis");

// Get the variable.
RtBasis *RiCatmullRomBasis;
RiCatmullRomBasis = (RtBasis*)GetProcAddress(h, "RiCatmullRomBasis");

// Call the function, passing it the variable.
RiBasis(RiCatmullRomBasis);

Visual C ++在调用RiBasis时给出了这个编译错误:

error C2664: 'void (float [][4])': cannot convert argument 1
from 'RtBasis (*)' to 'float [][4]'

我尝试从RiCatmullRomBasis变量中删除一个间接级别:

// Get the variable.
RtBasis RiCatmullRomBasis;
RiCatmullRomBasis = (RtBasis)GetProcAddress(h, "RiCatmullRomBasis");

// Call the function, passing it the variable.
RiBasis(RiCatmullRomBasis);

但是这给了我关于GetProcAddress调用的以下内容:

error C2440: 'type cast': cannot convert from 'FARPROC' to 'RtBasis'
note: There are no conversions to array types, although there are
conversions to references or pointers to arrays

在C ++代码中声明类型的正确方法是什么?

答案

在第一个版本中,将呼叫设为:

RiBasis(*RiCatmullRomBasis);

您需要获取变量的地址(这是GetProcAddress可以返回的),但该函数采用实例而不是指针,因此您必须取消引用返回的指针。

以上是关于如何从DLL中检索数组变量? (Visual C ++)的主要内容,如果未能解决你的问题,请参考以下文章

C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]

如何从 C# 中的 C++ dll 中的全局变量从函数中获取返回数组?

从 VB6 调用 C dll,其中 dll 是使用 Visual Studio 2013 编写的

如何将 unsigned short* 从 Visual-C++ DLL 传递到 VB.NET

如何将 Visual C 运行时静态链接到我的程序中? [复制]

在 Visual Studio 2012 中,如何将资源文件 (.rc) 与 c ++ dll 链接