BOOL LoadMyJpegFile(CString fname,LPPICTURE *lppi)
{
HANDLE hFile=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
CString str;
str.Format(_T("%s無法被開啟"),fname);
MessageBox(str);
return FALSE;
}
//取得檔案大小
DWORD dwFileSize=GetFileSize(hFile,NULL);
if((DWORD)-1==dwFileSize)
{
CloseHandle(hFile);
MessageBox(_T("影像檔是空的"));
return FALSE;
}
//讀取影像檔
LPVOID pvData;
//按檔案大小分配記憶體
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
if(NULL==hGlobal)
{
CloseHandle(hFile);
MessageBox(_T("記憶體不足,無法分配足夠記憶體"));
return FALSE;
}
pvData=GlobalLock(hGlobal);
if(NULL==pvData)
{
GlobalUnlock(hGlobal);
CloseHandle(hFile);
MessageBox(_T("無法鎖定記憶體"));
return FALSE;
}
DWORD dwFileRead=0;
BOOL bRead=ReadFile(hFile,pvData,dwFileSize,&dwFileRead,NULL);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
if(FALSE==bRead)
{
MessageBox(_T("讀檔案出錯"));
return FALSE;
}
LPSTREAM pstm=NULL;
//從已指派記憶體產生IStream流
HRESULT hr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);
if(!SUCCEEDED(hr))
{
MessageBox(_T("產生流操作失敗"));
if(pstm!=NULL)
pstm->Release();
return FALSE;
}
else if(pstm==NULL)
{
MessageBox(_T("產生流操作失敗"));
return FALSE;
}
if(!*lppi)
(*lppi)->Release();
hr=OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&(*lppi));
pstm->Release();
if(!SUCCEEDED(hr))
{
MessageBox(_T("載入操作失敗"));
return FALSE;
}
else if(*lppi==NULL)
{
MessageBox(_T("載入操作失敗"));
return FALSE;
}
return TRUE;
}