1。vb中的数组按地址传送,dll进行操作,vb如何传?
2。dll返回的是两个一维数组,如何让vb得到它们?如何在c中写相关代码?
谢谢拉~~~

解决方案 »

  1.   

    VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
    VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
      

  2.   

    VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
    VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
    ^_^
      

  3.   

    to TechnoFantasy(冰儿马甲www.applevb.com):
    1.是不是还要把每维的元素个数也传过去呢?
    2.“数组第一个值得地址作为ByVal参数传递”在c中直接把这个地址当二维的指针操作这个数组就可以么?
    3.“将数组第一个值得地址”,用什么api得到呢?是 VarPtrArray 还是VarPtr?我已经被SafeArray这个结构搞晕了
    谢谢~
      

  4.   

    传递的时候可以这样声明
    fn(byref pa as any)然后使用的时候
    dim b(30) as long
    fn(b(0))
      

  5.   

    当然,你也可以直接传safearray指针过去声明
    fn(ppsa() as any)使用的时候
    dim b(30) as long 
    fn(b())
      

  6.   

    c里面可以这样
    int __stdcall passarray(SAFEARRAY ** ppsa){
    return (int)(*ppsa)->pvData;
    }
      

  7.   

    1.是不是还要把每维的元素个数也传过去呢?这个应该不用吧?数组不是线性表嘛,二维在内存中也可以当做一维来处理吧?
    2.“数组第一个值得地址作为ByVal参数传递”在c中直接把这个地址当二维的指针操作这个数组就可以么?试一下呗~
    3.“将数组第一个值得地址”,用什么api得到呢?是 VarPtrArray 还是VarPtr?我已经被SafeArray这个结构搞晕了t(0,0)就是了吧?
      

  8.   

    现在传参问题解决了,能传过去。
    vb代码:
    Private Declare Function Fc1 Lib "ddd.dll" (ByVal FirstElement As Long, ByVal Size As Long, ByVal wsize As Long) As Long
    Private Sub Command2_Click()
    Dim Result As Long
    Dim i, j As IntegerDim MyArrayOfLongs(3, 3) As LongFor i = 0 To 3
      For j = 0 To 3
        MyArrayOfLongs(i, j) = 1
     Next j
    Next i
     MyArrayOfLongs(0, 0) = 0MyArrayOfLongs(0, 1) = 1MyArrayOfLongs(0, 2) = 2MyArrayOfLongs(0, 3) = 3
     Result = Fc1(VarPtr(MyArrayOfLongs(0, 0)), 4, 4)
     
    End Sub=====================
    vc代码:
    long __declspec (dllexport) __stdcall Fc1(long *pnFirstElement, long lSize,long wSize) {
          char strBuf[30];      for(int i=0;i<lSize;i++)
              
      {
            for(int j=0;j<wSize;j++)
    {
            wsprintf(strBuf,"arr[%d][%d]=%d",i,j,*((pnFirstElement+lSize*i)+j));
                 MessageBox(NULL,strBuf,"test",MB_OK);
    }   }      return 0;  }出现问题是:i和j正好反了,但出现的数都是对的。比如应该是MyArrayOfLongs(0, 2) = 2,结果却是MyArrayOfLongs(2, 0) = 2,这是怎么回事呢?
      

  9.   

    现在急需一个老师给我讲讲关于内存的基础知识我用winhex瞅了一中午,也没研究明白
    哪个明白的老师能留下qq啊?
    我qq是:43977368
      

  10.   

    这是由于safearray和c++的二维数组排列方式不同,所以就会出现这个问题
    出现问题是:i和j正好反了,但出现的数都是对的。比如应该是MyArrayOfLongs(0, 2) = 2,结果却是MyArrayOfLongs(2, 0) = 2,这是怎么回事呢?safearray使用的是以行为主的排列方式,
    c++使用的是以列为主的排列方式。redim b(1,2,3) as byte
    for i = 0 to 3
    for j = 0 to 2
    for k = 0 to 1
    debug.print varptr(b(k,j,i))
    next
    next
    next你可这样看一看多维数组是怎样排列的
      

  11.   

    终于弄明白是怎么排的了!假设:Dim i, j As Integer
    Dim aa As IntegerDim a(2,3) As LongFor i = 0 To 2
      For j = 0 To 3
      aa = aa + 1
        a(i, j) = aa
     Next j
    Next i在内存中:
    a(0,0) a(1,0) a(2,0) a(0,1) a(1,1) a(2,1) a(0,2) a(1,2) a(2,2) a(0,3) a(1,3) a(2,3) 
    是这样存储的,的确和c不一样谢谢各位!