最近在看一个网上的例子,利用vfw对视频头进行捕获,并利用回调函数把每帧的数据都放进了一个数组里面,我想利用drawdibdraw()这个函数把数据再显示到一个picture里面,但是不成功,还请大家帮忙啊!谢谢.
回调函数如下:
Function MyFrameCallback(ByVal lwnd As Long, ByVal lpVHdr As Long) As Long
    
    Dim VideoHeader As VIDEOHDR
    Dim VideoData() As Byte
    Dim hDrawDib As Long
    Dim hBitMap As BITMAPINFOHEADER
    Dim lr As Long
    hDrawDib = DrawDibOpen()
    
    '//Fill VideoHeader with data at lpVHdr
    RtlMoveMemory VarPtr(VideoHeader), lpVHdr, Len(VideoHeader)
    
    '// Make room for data
    ReDim VideoData(VideoHeader.dwBytesUsed)
    
    '//Copy data into the array
    RtlMoveMemory VarPtr(VideoData(0)), VideoHeader.lpData, VideoHeader.dwBytesUsed
      
    lr = DrawDibDraw(hDrawDib,Picture1.hdc, 0, 0, Picture1.Width, Picture1.Height, hBitMap, VideoHeader.lpData, 0, 0, hBitMap.biWidth, hBitMap.biSize, 0)
    '就这句,我参照网上一个Delphi程序写的,我不知道到底传进去的 hBitMap和VideoHeader.lpData 这两个参数有用没有,这里本来该取一个hBitMap的指针,但是我不知道该怎么取一个自定义类型的地址.....但是程序运行又不报错,不过lr 返回为0.    Debug.Print lr
    DrawDibClose (hDrawDib)
End Function
请高手帮帮忙啊~~~~谢谢!!!!

解决方案 »

  1.   

    我把hBitMap 变成varptr(hBitMap) 也是一样的,即不报错,但返回就是为0.
      

  2.   

    'Dim VideoHeader As VIDEOHDR的定义:
    Type VIDEOHDR
        lpData As Long '// address of video buffer
        dwBufferLength As Long '// size, in bytes, of the Data buffer
        dwBytesUsed As Long '// see below
        dwTimeCaptured As Long '// see below
        dwUser As Long '// user-specific data
        dwFlags As Long '// see below
        dwReserved(3) As Long '// reserved; do not use}
    End Type'Dim hBitMap As BITMAPINFOHEADER的定义:Type BITMAPINFOHEADER
            biSize As Long
            biWidth As Long
            biHeight As Long
            biPlanes As Integer
            biBitCount As Integer
            biCompression As Long
            biSizeImage As Long
            biXPelsPerMeter As Long
            biYPelsPerMeter As Long
            biClrUsed As Long
            biClrImportant As Long
    End Type'DrawDibDraw的定义:
    Private Declare Function DrawDibDraw Lib "msvfw32" ( _
            ByVaL hdd As Long, _
            ByVaL hdc As Long, _
            ByVaL xDst As Long, _
            ByVaL yDst As Long, _
            ByVaL dxDst As Long, _
            ByVaL dyDst As Long, _
            ByRef lpbi As BITMAPINFOHEADER, _ '我现在把这里改成 any 了,但是一样.
            lpBits As Any, _
            ByVaL xSrc As Long, _
            ByVaL ySrc As Long, _
            ByVaL dxSrc As Long, _
            ByVaL dySrc As Long, _
            ByVaL wFlags As Long) As Long
      

  3.   

    Declare Sub RtlMoveMemory Lib "kernel32" (ByVal hpvDest As Long, ByVal hpvSource As Long, ByVal cbCopy As Long)用 Debug.Print VideoHeader.dwBytesUsed    
       Debug.Print VideoData
    这个语句都是可以看到数据是复制到了VideoData里面的.
      

  4.   

    lr = DrawDibDraw(hDrawDib,Picture1.hdc, 0, 0, -1, -1, hBitMap, VideoHeader.lpData, 0, 0, hBitMap.biWidth, hBitMap.biHeight, 0)试看看?
      

  5.   

    少了个ByVal lr = DrawDibDraw(hDrawDib,Picture1.hdc, 0, 0, -1, -1, hBitMap,ByVal VideoHeader.lpData, 0, 0, hBitMap.biWidth, hBitMap.biHeight, 0)
      

  6.   

    先谢谢!
    我试了还是不行,返回0.
    lr = DrawDibDraw(hDrawDib,Picture1.hdc, 0, 0, -1, -1, hBitMap,ByVal VideoHeader.lpData, 0, 0, hBitMap.biWidth, hBitMap.biHeight, 0)
    这句我有个疑问,我们只是在前面声明了Dim hBitMap As BITMAPINFOHEADER 但是 hBitMap只是个结构和我们的数据好象都没有关系呀,能起作用吗?
      

  7.   

    BITMAPINFOHEADER结构要自己填充的吧.......