现在传参问题解决了,能传过去。 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++)
这是由于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你可这样看一看多维数组是怎样排列的
终于弄明白是怎么排的了!假设: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不一样谢谢各位!
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
^_^
1.是不是还要把每维的元素个数也传过去呢?
2.“数组第一个值得地址作为ByVal参数传递”在c中直接把这个地址当二维的指针操作这个数组就可以么?
3.“将数组第一个值得地址”,用什么api得到呢?是 VarPtrArray 还是VarPtr?我已经被SafeArray这个结构搞晕了
谢谢~
fn(byref pa as any)然后使用的时候
dim b(30) as long
fn(b(0))
fn(ppsa() as any)使用的时候
dim b(30) as long
fn(b())
int __stdcall passarray(SAFEARRAY ** ppsa){
return (int)(*ppsa)->pvData;
}
2.“数组第一个值得地址作为ByVal参数传递”在c中直接把这个地址当二维的指针操作这个数组就可以么?试一下呗~
3.“将数组第一个值得地址”,用什么api得到呢?是 VarPtrArray 还是VarPtr?我已经被SafeArray这个结构搞晕了t(0,0)就是了吧?
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,这是怎么回事呢?
哪个明白的老师能留下qq啊?
我qq是:43977368
出现问题是: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你可这样看一看多维数组是怎样排列的
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不一样谢谢各位!