BOOL CGifImage::LoadFromBuffer(const BYTE* lpBuf, DWORD dwSize) { if (NULL == lpBuf || dwSize <= 0) return FALSE; HGLOBAL hGlobal = ::GlobalAlloc(GHND, dwSize); if (NULL == hGlobal) return FALSE; LPVOID lpBuffer = ::GlobalLock(hGlobal); if (NULL == lpBuffer) { ::GlobalFree(hGlobal); return FALSE; } memcpy(lpBuffer, lpBuf, dwSize); ::GlobalUnlock(hGlobal); LPSTREAM lpStream = NULL; HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &lpStream); if (hr != S_OK) { ::GlobalFree(hGlobal); return FALSE; } BOOL bRet = LoadFromIStream(lpStream); lpStream->Release(); return bRet; }
BOOL CImageEx::LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName, LPCTSTR pszResType) { HRSRC hRsrc = ::FindResource(hInstance, pszResourceName, pszResType); if (NULL == hRsrc) return FALSE; DWORD dwSize = ::SizeofResource(hInstance, hRsrc); if (0 == dwSize) return FALSE; HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc); if (NULL == hGlobal) return FALSE; LPVOID pBuffer = ::LockResource(hGlobal); if (NULL == pBuffer) { ::FreeResource(hGlobal); return FALSE; } HGLOBAL hGlobal2 = ::GlobalAlloc(GHND, dwSize); if (NULL == hGlobal2) { ::FreeResource(hGlobal); return FALSE; } LPVOID pBuffer2 = ::GlobalLock(hGlobal2); if (NULL == pBuffer2) { ::GlobalFree(hGlobal2); ::FreeResource(hGlobal); return FALSE; } memcpy(pBuffer2, pBuffer, dwSize); ::GlobalUnlock(hGlobal2); LPSTREAM pStream = NULL; HRESULT hr = ::CreateStreamOnHGlobal(hGlobal2, TRUE, &pStream); if (hr != S_OK) { ::GlobalFree(hGlobal2); ::FreeResource(hGlobal); return FALSE; } BOOL bRet = LoadFromIStream(pStream); if (pStream) pStream->Release(); ::FreeResource(hGlobal); return bRet; }