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

Posted

技术标签:

【中文标题】如何从 DLL 中检索数组变量? (视觉 C++)【英文标题】:How to retrieve array variable from DLL? (Visual C++) 【发布时间】:2017-12-24 05:58:02 【问题描述】:

第 3 方 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++ 代码中声明类型以使其工作的正确方法是什么?

【问题讨论】:

See this。为什么要将函数指针的地址转换为float 的二维数组? 一旦你 LoadLibray,全局变量应该可以在你的代码中访问,但是你对变量执行 GetProcAddress,即使它不是一个函数。您是否尝试过在代码中声明 extern "C" RtBasis RiCatmullRomBasis; 然后尝试访问它? 根据文档,GetProcAddress() 也用于返回导出变量的地址。 【参考方案1】:

在第一个版本中,调用如下:

RiBasis(*RiCatmullRomBasis);

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

【讨论】:

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

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

如何在 C++ 中使用静态变量在不同的类之间共享一个数组?

嵌入式单声道:将数组从 C# DLL 返回/复制到 C++

如何将数组从 c++ 传递给 python 函数并将 python 返回的数组检索到 c++

当参数之一是指针数组时,如何从 C# 调用 C++ DLL

如何从多级数组中检索变量 - Vue.js