2011-08-19 82 views
2

我試圖從我的IStream實例中複製一些二進制數據(因爲Gdiplus ::圖像只保存到IStream派生對象,或文件路徑)到一個字符指針,我可以通過簡單地知道分配的二進制大小並有權訪問指針。如何將IStream實例中的數據讀入char指針?

我班如下:

Upload::Upload(Gdiplus::Bitmap* bitmap, CLSID clsEncoderId) 
{ 
    int result; 
    STATSTG statResult; 

    result = CreateStreamOnHGlobal(0, TRUE, &m_hBufferStream); 

    if (result != S_OK) 
     MessageBoxW(NULL, _T("Upload::Upload(): Could not create stream"), _T("Point"), MB_OK | MB_ICONERROR); 
    else 
    { 
     if (bitmap->Save(m_hBufferStream, &clsEncoderId, NULL) != Gdiplus::Ok) 
      MessageBoxW(NULL, _T("Upload::Upload(): Could not save() image"), _T("Point"), MB_OK | MB_ICONERROR); 
    } 

    if (m_hBufferStream->Stat(&statResult, STATFLAG_NONAME) != S_OK) 
     return; 

    Gdiplus::Image test(m_hBufferStream, TRUE); 
    test.Save(_T("hejs.png"), &clsEncoderId, NULL); 

    m_iSize = statResult.cbSize.LowPart; 
} 

char* Upload::GetBinaryData() 
{ 
    char* buffer = (char*)malloc(m_iSize); 
    ULONG size = 0; 

    m_hBufferStream->Read(buffer, m_iSize, &size); 

    return buffer; 
} 

在我的函數處理上傳實例我這樣做:

char* pBuffer = upload->GetBinaryData(); 
buffer.write(pBuffer, upload->GetSize()); 

但存儲在存儲器是錯誤的(奇怪的是這似乎是一個模式,雖然)。

我在做什麼錯?

在此先感謝。

P.S .: 測試Image-instance在從m_hBufferStream中讀取後成功保存到文件中。

回答

1

首先,IStream::Read()不需要精確讀取指定的字節數 - 它只需要讀取不超過該數字。實際數字存儲在由第三個參數指向的可見的內部。

其次,您不檢查Read()返回的HRESULT

一個更好的策略是在循環中調用Read(),檢查它的返回值並根據實際讀取的字節數調整指向緩衝區的指針。

相關問題