同学在vc的程序中把位图拷贝到内存中,我要在vb的程序中把位图读出来,看了斑竹zyl910以前的一些文章,试着做,可惜搞不定,希望大家能帮帮忙了。
vc中相关的程序段:   
      LPBITMAPINFOHEADER lpbi = pspview->GetGraph();
      ihl.lDIB = GlobalSize((HANDLE)lpbi);
      memcpy(lpData,lpbi,ihl.lDIB);
      GlobalFree((HANDLE)lpbi); /*free memory*/   
   
我在vb的module中的相关程序段,
   Dim MyBMIH As BITMAPINFOHEADER
   Dim MyWidthBytes As Long
   Dim MyPtr As Long
   Dim MyhDIB As Long
   Dim MyhDC As Long
   Dim hOldMap As Long
   Dim MapAddress as long
   Dim MapHandle as Long
   MapHandle = OpenFileMapping(FILE_MAP_READ, False, "PrintMap")
   MapAddress = MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0)'找到映射文件的地址   CopyMemory MyBMIH, ByVal (MapAddress), Len(MyBMIH)
   MyhDC = CreateCompatibleDC(0)
   MyhDIB = CreateDIBSection(MyhDC, MyBMIH, 0, MyPtr, 0, 0)
   hOldMap = SelectObject(MyhDC, MyhDIB)
   '下面有问题,不知道该怎么解决
   CopyMemory ByVal MyPtr, ByVal MapAddress,MyBMIH.biSizeImage
   BitBlt Form1.Picture1.hdc, 0, 0, Form1.Picture1.ScaleWidth, Form1.Picture1.ScaleHeight, MyhDC, 0, 0, vbSrcCopy    '传输位图数据
   DeleteObject SelectObject(MyhDC, hOldMap)
   DeleteObject MyhDC

解决方案 »

  1.   

    MyPtr没有指向有效的内存空间阿
      

  2.   

    ' Global Memory Flags
    Const GMEM_MOVEABLE = &H2
    Const GMEM_ZEROINIT = &H40Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)Private Declare Function GlobalAlloc Lib "kernel32" ( _
        ByVal wFlags As Long, _
        ByVal dwBytes As Long) As LongPrivate Declare Function GlobalSize Lib "kernel32" ( _
        ByVal hMem As Long) As LongPrivate Declare Function GlobalLock Lib "kernel32" ( _
        ByVal hMem As Long) As LongPrivate Declare Function GlobalUnlock Lib "kernel32" ( _
        ByVal hMem As Long) As LongConst PictureID = &H746C&Private Type PictureHeader
        Magic As Long
        Size As Long
    End TypePublic Function Array2Picture(aBytes() As Byte) As StdPicture
        Dim oIPS As IPersistStream
        Dim oStream As IStream
        Dim hGlobal As Long
        Dim lPtr As Long
        Dim lSize As Long
        Dim Hdr As PictureHeader
        
        ' Create a new empty
        ' picture object
        Set Array2Picture = New StdPicture
        
        ' Get the IPersistStream interface
        Set oIPS = Array2Picture
        
        ' Calculate the array size
        lSize = UBound(aBytes) - LBound(aBytes) + 1
        
        ' Allocate global memory
        hGlobal = GlobalAlloc(GHND, lSize + Len(Hdr))
        
        If hGlobal Then
            
            ' Get a pointer to the memory
            lPtr = GlobalLock(hGlobal)
            
            ' Initialize the header
            Hdr.Magic = PictureID
            Hdr.Size = lSize
            
            ' Write the header
            MoveMemory ByVal lPtr, Hdr, Len(Hdr)
            
            ' Copy the byte array to
            ' the global memory
            MoveMemory ByVal lPtr + Len(Hdr), aBytes(0), lSize
            
            ' Release the pointer
            GlobalUnlock hGlobal
            
            ' Create a IStream object
            ' with the global memory
            Set oStream = CreateStreamOnHGlobal(hGlobal, True)
           
            ' Load the picture
            ' from the stream
            oIPS.Load oStream
            
            ' Release the IStream
            ' object
            Set oStream = Nothing
            
        End If
    End Function以上代码需要OLELIB.tlb支持,如有需要请留E-Mail
      

  3.   

    to SnHnBn(大可达) :那应该怎么样做呀??to ltpao(啊炮) :你这段程序怎么解决我的问题呀?
      

  4.   

    你的CreateDIBSection在VB里面的申明是什么?
      

  5.   

    to SnHnBn(大可达) : 申明是下面这样的,有错吗?
    Public Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFOHEADER, ByVal un As Long, lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
      

  6.   

    好像MyPtr没有问题。
    CreateDIBSection我不太熟悉,看你的程序,似乎MyPtr指向的内存包含了BITMAPINFOHEADER位图头结构。不知道这个参数是不是仅仅包含位图数据还是要包括整个位图文件数据。
      

  7.   

    看看能否用剪贴板实现,参考:
    http://search.csdn.net/expert/topic/51/5101/2003/5/3/1736081.htm
      

  8.   

    谢谢各位,研究了几天,终于搞定了。现在把问题再理一遍,有始有终^_^。由于同学的vc程序中拷贝到内存中的位图是256色也就是8位的,因此位图的结构是,位图信息头+调色板信息+位图数据(8位以上的位图就没有调色板了)。所以我前面的程序错在没有读入调色板信息。MyPtr是没有问题的。好了,把分数发给大家,再次表示感谢!!