2012-02-06 73 views
4

我已經這段代碼在Windows 7工作的64位:它可以讓我包含成std::stringBase64EncodedImage)的Image的表示變換爲一個GdiPlus::Bitmap位圖:: FROMFILE方法返回NULL在x86

HRESULT hr; 
using namespace Gdiplus; 
std::string decodedImage = Base64EncodedImage; 
DWORD imageSize = decodedImage.length(); 

HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, imageSize); 
if (!hMem) 
    ErrorExit(TEXT("GlobalAlloc")); //http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx 

LPVOID pImage = ::GlobalLock(hMem); 
if (!pImage) 
    ErrorExit(TEXT("GlobalLock")); 

CopyMemory(pImage, decodedImage.c_str(), imageSize); 
IStream* pStream = NULL; 

BitmapData* bitmapData = new BitmapData; 
if (::CreateStreamOnHGlobal(hMem, FALSE, &pStream) != S_OK) 
    ErrorExit(TEXT("CreateStreamOnHGlobal")); 
else 
{ 
    bitmap = Bitmap::FromStream(pStream); //FAILS on WIN32 
    if (!bitmap) 
     ErrorExit(TEXT("FromStream")); 

    RECT clientRect; 
    GetClientRect(hwnd, &clientRect); 

    bitmapClone = bitmap->Clone(0, 0, clientRect.right, clientRect.bottom, PixelFormatDontCare); 
    delete bitmap; 
    bitmap = NULL;  
} 

但它無法在Windows 7 32位,特別是在這條線:

bitmap = Bitmap::FromStream(pStream); 

它總是返回NULL,但我不能讓這怎麼工作在x64上而不是在86。如果有人能夠啓發我,我會很感激。

謝謝!

+0

不是專家,但你不應該'它傳遞給'CreateStreamonHGlobal'之前GlobalUnlock'內存? [MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/aa378980 \(v = vs.85 \).aspx)說:「當你有內存句柄時避免調用對象的方法與GlobalLock鎖定在一起,這會導致方法調用失敗,無法預料。「 – user786653 2012-02-06 18:12:56

+0

據我所知,我應該鎖定/ CreateStreamOnHGlobal/Unlock;我會盡力去做你說的。 – 2012-02-06 18:34:45

+0

可能的重複http://stackoverflow.com/questions/2746855/how-can-i-create-an-image-in-gdi-from-a-base64-encoded-string-in-c – 2012-02-06 18:44:57

回答

8

您提供的代碼適合我。

但是,當我評論了GDI +初始化後,Bitmap::FromStream(pStream)方法總是返回NULL指針。

你有GDI +初始化嗎?

GdiplusStartupInput gdiplusStartupInput; 
ULONG_PTR gdiplusToken; 
// Initialize GDI+. 
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 

順便說一句,在GDI +非初始化:

GdiplusShutdown(gdiplusToken); 
+0

是的,它已經初始化。代碼在win32和win64中保持不變。爲這個問題添加更多的上下文,這已經使用Firebreath(http://www.firebreath.org);並在目標爲32位版本的64位機器上使用MS Visual C++。 – 2012-02-06 19:14:12

+0

您可以檢查最後一個錯誤(在'Bitmap :: FromStream'後面調用'GetLastError()')嗎? – 2012-02-06 20:03:12

+0

[僅供參考](http://www.codeproject.com/Messages/787169/Re-Bitmap-FromStream-returns-NULL-solution.aspx)。另外,在你的情況下'GdiplusStartup'函數返回的狀態是什麼? – 2012-02-06 20:11:11