我用VC编写了一个简单的DLL,导出函数如下:
extern "C" __declspec(dllexport) int  SUM(int * a,int n) 
{
int sum = 0;
   for(int i = 0; i < n; i ++)
   sum += a[i];
   return sum;
}然后在VB中进行调用,如下:
Private Declare Function SUM Lib "test" (ByRef a() As Long, ByVal n As Long) As LongPrivate Sub Command1_Click()
Dim a(3) As Long
Dim n As Longa(0) = 0
a(1) = 1
a(2) = 2
a(3) = 3
n = 4
MsgBox (SUM(a, n))
End Sub但结果总是莫名其妙,请问各位高手错在何处?

解决方案 »

  1.   

    VB的数组不能等同于VC的指针,在VC中使用VB的数组应该用SafeArray
      

  2.   

    VB中的Array在内存的表现有一个头,表明这个Array的元素个数、上标、下标。所以要用下面的方法:Private Declare Function fnSum Lib "yourlib.dll" _
            (ByVal a As Long, ByVal b As Long) As LongSub MyTest()
        Dim a(3) As Long
        
        a(0) = 1
        a(1) = 2
        a(2) = 3
        a(3) = 4
        MsgBox fnSum(VarPtr(a(0)), 4)
    End Sub你要取第一个数组元素的地址,直接用ByRef a()是不可以的。
      

  3.   

    上面的老兄说的很对,我试过了,但传递数组首地址应按如下写法:
    fnSum(a(0), 4)
    不知我说的是否正确?
    而且我很孤陋寡闻,竟不知VB中还有SafeArray,敬请ruihuahan指教!
    所有参与我问题的朋友一并谢了!!!