VB调用C++的DLL函数,参数是自定义结构体数组,这个参数是要输出的
Private Declare Function FunctionA Lib "A.DLL" (ByVal objptr As Long, ByRef B As STRUCTA) As IntegerPrivate Type STRUCTA
    ID(1 To 5)   As Long
    Num(1 To 6)       As Long
End Type我在VB里调用:
    Dim INFO() As STRUCTA
    str = FunctionA (longa, INFO)这样语法会报错,说INFO和申明的类型不同
可是ByRef B As STRUCTA-〉ByVal B As STRUCTA又不可以,自定义只能ByRef 哪位高手帮我看看,如何改阿
谢谢!

解决方案 »

  1.   

    试试API定义为As Any,然后其他地方用Variant
      

  2.   

    什么意思啊
    ByRef B As STRUCTA改成ByRef B As Any
    Variant是改哪里啊
      

  3.   

    Dim INFO() As STRUCTA 
    Redim INFO(3) '需要分配内存'
    str = FunctionA (longa, INFO(0)) '传入数组第一个成员的地址' 
      

  4.   

    lsd的不行啊
    调用dll后,只对INFO(0)的数保留了,INFO(1)的在vb中还是没有被赋值
      

  5.   

    关键是你的 C++ 函数是否将指针当作数组用。
    否则 VB 中你就需逐个将数组成员作为参数进行函数调用。
      

  6.   

    试试不要redim,在声明时就定好大小
      

  7.   

    在声明时就定好大小也不行的
    一样的结果我的c++的函数是这样的FunctionA (long longa,
    STRUCTA * s)
    {
       s(0).Nam(1) = "123"
       s(1).Nam(1) = "456"}然后vb调用后,s(0)是"123",可是s(1).Nam(1) 还是空的
      

  8.   

    C 中数组应该用方括号吧。
    还有 C 中的 STRUCTA 怎样定义的,明显与 VB 声明不符。
      

  9.   

    是[]的
    打错了
    FunctionA (long longa, 
    STRUCTA * s) 

      s[1].Num(1) = 123
      s[1].Num(1) = 456} 
    都对的
    因该是vba里哪里错了
    传地址或dll导入的地方
    大家帮我想想
      

  10.   

    s[1].Num(1)
    方括号!
    下标!
      

  11.   

    c里面没有问题
    是不是要用一下vb技术阿
    Dim pOutputArray As Long 
    outputArray() As Byte
    ReDim outputArray(100) As Byte 
    pOutputArray = VarPtr(outputArray(0)) FunctionA (longa, pOutputArray ) CopyMemory ByVal pOutputArray, ByVal pData, UBound(outputArray)可是pData是什么啊,在我代码里是什么啊
      

  12.   

    问题就在 C 代码中,要被 VB 调用的函数必须符合一定规则。
      

  13.   

    我的c++函数被调到的
    只是只保存了数组第1个的值
    lsd发现我c里有问题吗请指点
      

  14.   

    我还是觉得可能是没有使用CopyMemory的问题
    有人可以告诉我的程序里如何正确使用这个吗
    谢谢
      

  15.   

    Private Declare Function FunctionA Lib "A.DLL" (ByVal objptr As Long, ByRef B As STRUCTA) As Integer 
    ---声明中的B 是一个单个STRUCTA变量,
     Dim INFO() As STRUCTA 
        str = FunctionA (longa, INFO) ------调用时INFO是一个STRUCTA 数组,INFO和申明的类型不同是理所当然的 .
      

  16.   

    CopyMemory如何用啊,是否一定要用CopyMemory呢,否则无法将C++的数组拷到VBA里?
      

  17.   

    struct STRUCTA
    {
    long ID[5];
    long NumID[6];
    }
    DLL_EXPORT int __stdcall FunctionA(long a, STRUCTA IDInfo[])
    {
        IDInfo[0].ID[0] = 2;
        IDInfo[1].ID[0] = 3;
    }
      

  18.   

    STRUCTA IDInfo[] 改为 STRUCTA * IDInfo
      

  19.   

    http://www.cnblogs.com/xw885/archive/2005/11/22/105264.html
      

  20.   

    c++里,函数参数换成STRUCTA * IDInfo乐
    可是我vb里,现在是
    Private Declare Function FunctionA Lib "A.DLL" (ByVal objptr As Long, ByVal B As long) As IntegerDim INFO() As STRUCTA 
        
        Dim pOutputArray As Long
        ReDim INFO(4) As STRUCTA 
        pOutputArray = VarPtr(INFO(0))
        str = FunctionA (longa, pOutputArray ) vb里有错吗,可是报了个内存不足的错误Tiger_Zhao:vb则么改阿
      

  21.   

    问题是,我的dll函数的那个结构体数组,是个出力的结果
    现在只有数组1里有值,后面都没有被覆值
      

  22.   

    感觉我vb这样传地址给c,c再给我后,就给了我数组1的内容
    我给c的就是1个结构体的大小,所以c对数组2,3赋值后,传给vb,vb没有接受到亚
    所以我想用CopyMemory试试有谁可以把我vb代码改称CopyMemory吗
      

  23.   

    结构体没有问题我看网上有说CopyMemory的
    可是用不来,感觉因该用这个
    谁可以把我代码改造下阿
      

  24.   

    1. 楼主不会提问题
       你提这种和代码有关的问题,应该把相关的代码都贴出来!2. 回答问题的瞎忙乎
       楼主的代码没有贴出来,大家回答都是瞎忙。3. VB的ByRef参数就是传递变量的指针,所以想传递数组只要传递数组第一个元素就可以。这些问题在MSDN都可以找到答案。3楼的说的对。4. C里面,数组long ID[5]含六个元素ID[0]...ID[5];VB里面,数组ID(1 To 5)  As Long 含5个元素。