【发布时间】:2012-02-06 16:21:53
【问题描述】:
我有这段代码在 64 位 Windows 7 上运行:它允许我将包含在 std::string (Base64EncodedImage) 中的 Image 的表示转换为 GdiPlus::Bitmap:
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 上是如何工作的,但在 x86 上却不行。如果有人能启发我,我将不胜感激。
谢谢!
【问题讨论】:
-
不是专家,但您不应该在将内存传递给
CreateStreamonHGlobal之前GlobalUnlock吗? MSDN 说“避免在使用 GlobalLock 锁定内存句柄时调用对象的方法。这可能导致方法调用意外失败。”。 -
据我所知,我应该 Lock/CreateStreamOnHGlobal/Unlock;我会按照你说的去做。
-
是的,但问题不在于如何创建图像(解决了......有点),而是它如何在 64 位而不是 32 位上工作。