如何将包含数组 ByVal 的结构C++?
How to pas a struct containing an array ByVal to C++?
我正在使用第三方C++dll,它使用具有以下签名的函数:
extern "C" __declspec(dllimport) int __stdcall CalcDDtable(struct ddTableDeal tableDeal,
struct ddTableResults * tablep);
每个结构仅包含一个固定的一维int
s (VB6Long
s)。tablep
将包含结果。
如果C++声明是:
extern "C" __declspec(dllimport) int __stdcall CalcDDtable(int * tableDeal, int * tablep);
那么 VB6Declare
语句将是:
Declare Function CalcDDtable Lib "my3rdParty.dll"(ByRef lngTable as Long,ByRef lngResult as Long) as int
This code would be called like:
Dim lngTables(15) As Long
Dim lngResults(20) As Long
'Initialize the lngTables array...
intResult=CalcDDtabel(lngTables(0),lngResults(0))
但是我不知道如何声明上面的函数,因为第一个数组打包在一个不是指针的结构中。
不能按值将结构从 VB6 传递到 DLL。tableDeal结构是按值(不是指针)的,所以我不确定你能在那里做什么。
您可以通过引用传递结构,它们可以包含固定长度的数组,因此您的第二个 arg 就可以了。事实上,如果它只包含一个固定长度的整数数组,你可以像问题的第二部分一样传递一个固定长度的 VB6 长数组。
如果结构定义为:
struct ddTableDeal {
int data[ ITEM_COUNT ];
};
那么 AFAIK 你不能使用 array 在VB
中调用它,因为在这个结构的大小C/C++
是sizeof(int)*ITEM_COUNT
的(对于填充来说可能更大,但在VB
数组是动态的,并且将使用SafeArrayCreate
或SafeArrayCreateVector
在堆中分配,所以这些数组的大小总是固定的。我不太了解VB
但是如果您可以在VB
中创建结构并按顺序使用int
ITEM_COUNT
(Long
在VB
中),它可能会起作用,但最好的解决方案是在C/C++
中编写一个代理函数,该函数从VB
中获取变量,创建结构并调用原始函数,然后在提供的缓冲区中返回结果VB
!
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?