我在做一个传输图象的程序,程序中用GetBitmapBits把位图放到缓存,用SetBitmapBits把数据从缓存放到位图,代码如下,可是两个函数的返回值都是0,请问发生错误的原因在哪啊?在发送程序中:Dim BufferSize As Long, BitmapBuffer() As ByteBufferSize = GetSystemMetrics(SM_CXSCREEN) * GetSystemMetrics(SM_CYSCREEN) * 4
    
ReDim BitmapBuffer(1 To BufferSize) As ByteGetBitmapBits(hBitmap, BufferSize, BitmapBuffer)在接收程序中:Dim BufferSize As Long, ReceiveBuffer() As ByteBufferSize = GetSystemMetrics(SM_CXSCREEN) * GetSystemMetrics(SM_CYSCREEN) * 4
    
ReDim ReceiveBuffer(1 To BufferSize) As ByteSetBitmapBits(hBitmap, BufferSize, ReceiveBuffer)两个函数的返回值都是0,不知道是错在哪里了,请高手帮看看吧?

解决方案 »

  1.   

    可以用 GetLastError 查看错误是什么Private Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
    Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
    Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200Public Function GetLastDllErr(ByVal lErr As Long) As String
        Dim sReturn As String
        sReturn = String$(256, 32)
        FormatMessage FORMAT_MESSAGE_FROM_SYSTEM Or _
            FORMAT_MESSAGE_IGNORE_INSERTS, 0&, lErr, _
            0&, sReturn, Len(sReturn), ByVal 0
        sReturn = Trim(sReturn)
        GetLastDllErr = sReturn
        
    End Function
      

  2.   

    粗看有两个问题,先说最简单的:
    GetBitmapBits返回0,是因为参数传法用错了,
    GetBitmapBits不知你是怎么都声明的,若按标准声明
    Declare Function GetBitmapBits Lib "gdi32" Alias "GetBitmapBits" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long你的代码应该这样写
    r=GetBitmapBits(hBitmap, BufferSize, BitmapBuffer(0))
    也就是说最后一个参数要传数组首元素的内存地址SetBitmapBits的问题相同再说复杂点的:
    传输图象,理论上是不能用GetBitmapBits的,因为它获取的是DDB位图数据,即设备相关位图,不宜跨设备使用,除非接收方的屏幕分辨率及色深与发送方完全一致,而这在异地传输中是不太容易保证的。这种用途下GetDIBits要更合适。你面对问题还很多。