//Post By lixiaosan(小三) on http://community.csdn.net/Expert/topic/4193/4193617.xml?temp=.4021723
HBITMAP ImageLoad(LPCTSTR szFile, HBITMAP hRet)
{
LPPICTURE gpPicture;
// open file
HANDLE hFile = ::CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
ASSERT(INVALID_HANDLE_VALUE != hFile);
// get file size
DWORD dwFileSize = ::GetFileSize(hFile, NULL);
ASSERT(-1 != dwFileSize);
LPVOID pvData = NULL;
// alloc memory based on file size
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
ASSERT(NULL != hGlobal);
pvData = ::GlobalLock(hGlobal);
ASSERT(NULL != pvData);
DWORD dwBytesRead = 0;
// read file and store in global memory
BOOL bRead = ::ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
ASSERT(FALSE != bRead);
::GlobalUnlock(hGlobal);
::CloseHandle(hFile);
LPSTREAM pstm = NULL;
// create IStream* from global memory
HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
ASSERT(SUCCEEDED(hr) && pstm);
// Create IPicture from image file
hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
ASSERT(SUCCEEDED(hr) && gpPicture);
pstm->Release();
OLE_HANDLE picHandle;
gpPicture->get_Handle(&picHandle);
HDC hdc = ::CreateCompatibleDC(NULL);
ASSERT(hdc);
::SelectObject(hdc, (HGDIOBJ) picHandle);
hRet = (HBITMAP)::GetCurrentObject(hdc, OBJ_BITMAP);
DeleteDC(hdc);
// Get width and height
// BITMAP bmpTemp;
// memset(&bmpTemp, 0, sizeof BITMAP);
// ::GetObject(hRet, sizeof BITMAP, &bmpTemp);
// iWidth = bmpTemp.bmWidth;
// iHeight = bmpTemp.bmHeight;
return hRet;
}