Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)Private Sub Form_Load() Dim Mydate() As Byte, TempDate() As Byte Dim DateAdr As Long Mydate = LoadResData(101, "CUSTOM") DateAdr = VarPtr(Mydate(0))
ReDim TempDate(UBound(Mydate)) CopyMemory TempDate(0), DateAdr, UBound(Mydate) + 1 Open "d:\xxx.mdb" For Binary As #1 Put #1, , TempDate Close #1 End Sub 上面的代码,运行后,总是出错····我想知道如何用 CopyMemory 把资源文件 在内存里复制1下,再输出·····
ReDim TempDate(UBound(Mydate)) 上面写少了个 as byte() 不过这样也是错误运行后,出现 该内存不能为read
1. 如果你的Dll是用vb写的,可以: Sub test(ByRef arr() As Byte) Debug.Print LBound(arr), UBound(arr) Debug.Print arr(0), arr(1)End SubPrivate Sub Command1_Click() Dim arr(1) As Byte
arr(0) = 1 arr(1) = 2
test arr
End Subarr(0)是SAFEARRAY结构中第一个数据元素,其地址是数据地址,跟arr()不同的 arr()就是 SAFEARRAY*,也就是数组指针(即数组地址) ByRef arr() As Byte 就是 SAFEARRAY**,也就是数组指针的地址 2. 如果你的Dll是用vc写的,那么: vc: void test(SAFEARRAY**) //指针的地址,SAFEARRAY需要看windows api才行 3.使用SAFEARRAY这个会产生更多操作,直接传数据地址和数据长度所花费更少,windows api几乎都是采用后者的。vb使用SAFEARRAY,是因为省去很多麻烦(如上述1),给有些函数如split、join等带来方便。
''''''''''知道地址和长度后,怎么写?
Close #1
而应该使用VarPtrArray或者VarPtrStringArray(具体声明自己找找吧),然后copymemory
Dim Mydate() As Byte, TempDate() As Byte
Dim DateAdr As Long
Mydate = LoadResData(101, "CUSTOM")
DateAdr = VarPtr(Mydate(0))
ReDim TempDate(UBound(Mydate)) CopyMemory TempDate(0), DateAdr, UBound(Mydate) + 1 Open "d:\xxx.mdb" For Binary As #1
Put #1, , TempDate
Close #1
End Sub
上面的代码,运行后,总是出错····我想知道如何用 CopyMemory 把资源文件 在内存里复制1下,再输出·····
不过这样也是错误运行后,出现 该内存不能为read
正确的使用是这样的:
CopyMemory Byval VarPtr(TempDate(0)), Byval VarPtr(Mydate(0)), UBound(Mydate) + 1
如果要在同一个进程里输出,直接输出Mydata就可以了,不同进程需要用“进程通信”了,否则就会“该内存不能为read”。
如果传地址到DLL里:
1. 可以传首地址byval VarPtr(Mydate(0))和字节个数。
2.也可以传数组地址 byref Mydata,不用传字节个,数组地址是“安全数组(SAFEARRAY详见windows api)”的地址,已经包含了数组的个数定义)。
按照你的方法,传首地址byval VarPtr(Mydate(0))和字节个数 到DLL里,在DLL可以读取和输出数组了但是你说的第2个方法貌似更好,可以不传字节个数,“也可以传数组地址 byref Mydata”如果用这样的方法,在DLL里怎么处理呢?传首地址和个数,我就用CopyMemory复制到1个新的数组不知道用第2个方法,应该如何做?
Sub test(ByRef arr() As Byte)
Debug.Print LBound(arr), UBound(arr)
Debug.Print arr(0), arr(1)End SubPrivate Sub Command1_Click()
Dim arr(1) As Byte
arr(0) = 1
arr(1) = 2
test arr
End Subarr(0)是SAFEARRAY结构中第一个数据元素,其地址是数据地址,跟arr()不同的
arr()就是 SAFEARRAY*,也就是数组指针(即数组地址)
ByRef arr() As Byte 就是 SAFEARRAY**,也就是数组指针的地址
2. 如果你的Dll是用vc写的,那么:
vc: void test(SAFEARRAY**) //指针的地址,SAFEARRAY需要看windows api才行
3.使用SAFEARRAY这个会产生更多操作,直接传数据地址和数据长度所花费更少,windows api几乎都是采用后者的。vb使用SAFEARRAY,是因为省去很多麻烦(如上述1),给有些函数如split、join等带来方便。