【问题标题】:Output array parameter in a C++ DLL function called from VB6从 VB6 调用的 C++ DLL 函数中的输出数组参数
【发布时间】:2018-03-17 12:01:05
【问题描述】:

我需要一个数组作为 C++ 函数中的输出参数,然后从 VB6 调用该数组。我在 DLL 项目中使用 VS 2015 和 C++。

我找不到创建数组并在 C++ 代码中返回它的方法(这将是最好的解决方案),所以我试图在 VB6 代码中创建一个足够大的数组并将其作为参数传递,然后在 C++ 代码中更改它并再次使用 VB6 中的结果值。下面是一个字节数组的例子,但我的最终函数需要是一个结构数组,所以用字符串代替字节数组的解决方案不起作用。

C++ 代码(调用本身有效):

__declspec(dllexport) void  __stdcall Test(
    char* data, int* len)
{
    *len = 3;
    data[0] = 1;
    data[1] = 2;
    data[2] = 3;
}

VB6 代码:代码有效,长度参数按预期更改但数据数组未更改,仍为零:

Private Declare Sub Test Lib "MyDll.dll" (ByRef data() As Byte, length As Long)

Dim data(10) As Byte
Dim length As Long
Call Test(data, length)

【问题讨论】:

标签: c++ arrays dll vb6


【解决方案1】:

我找到了一个可行的解决方案here

就是在VB6中这样声明和调用函数:

Private Declare Sub Test Lib "MyDll.dll" (ByRef data As Byte, length As Long)

Dim data(10) As Byte
Dim length As Long
Call Test(data(LBound(data)), length)

【讨论】:

  • 其实我没有提到这个技术,因为它通常不适合用户定义类型的数组。对于内置类型的数组是可以的,对于不包含字符串的结构也可以,但是对于带有字符串的结构就不行了,因为看到byref data as struct_type,VB 将只转换第一个结构 to ANSI 的实例并传递一个指向该结构的指针,这将破坏 C++ 代码,该代码将尝试对该指针使用指针数学。
  • 为了安全起见,需要声明byval data as long,传递VarPtr(data(LBound(data)),并在C++端处理宽字符串。
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2021-08-26
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
相关资源
最近更新 更多