本帖最后由 bcrun 于 2010-08-05 13:38:57 编辑

解决方案 »

  1.   

    传地址和长度出去就好了如果DLL是C写的话,可以直接用指针变量去读,如果VB的话,可以用COPYMEMORY读
      

  2.   

    将地址和数据字节数这个长度都用LONG型传啊
      

  3.   

    地址和长度都传进去了,怎么在知道 地址和 长度的情况下把它写到硬盘上来?         Open "D:\1.txt" For Binary As #1
            ''''''''''知道地址和长度后,怎么写?
            
            Close #1
      

  4.   

    用copymemory把数据读到一个数组中,再把数组内容输出到txt中啊
      

  5.   

    VB里面的数组都是安全数组,仅仅取数组里面某个元素的地址恐怕不行DateAdr = VarPtr(Mydate(0))...
    而应该使用VarPtrArray或者VarPtrStringArray(具体声明自己找找吧),然后copymemory
      

  6.   

    不是取某个元素,而是读取全部等于Mydate = LoadResData(103, "CUSTOM")不过要由DLL去从地址重新读取
      

  7.   

    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下,再输出·····
      

  8.   

    ReDim TempDate(UBound(Mydate)) 上面写少了个 as byte()
    不过这样也是错误运行后,出现 该内存不能为read
      

  9.   


    正确的使用是这样的:
    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)”的地址,已经包含了数组的个数定义)。
      

  10.   

    我是要传到DLL里的
    按照你的方法,传首地址byval VarPtr(Mydate(0))和字节个数 到DLL里,在DLL可以读取和输出数组了但是你说的第2个方法貌似更好,可以不传字节个数,“也可以传数组地址 byref Mydata”如果用这样的方法,在DLL里怎么处理呢?传首地址和个数,我就用CopyMemory复制到1个新的数组不知道用第2个方法,应该如何做?
      

  11.   

    byref Mydata 传进去1个值进去了DLL里面怎么把数组给读取出来呢?
      

  12.   

    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等带来方便。