下边是一个显示jpeg图的函数,buf是jpeg图的数据,nLength是数据长度.现RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);时res总为0,说明buf没有写进pStm中去.请高手帮忙看一下怎没回事.谢谢void CTestJJDlg::DisplayJpeg(char* buf,int nLength)
{
CString m_Path;
CFile m_file;
IStream *pStm;
CFileStatus fstatus;
CDC* pDC=this->GetDC();
HRESULT RES;
int BUFFER_SIZE=nLength;//sizeof(buf);
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, BUFFER_SIZE);
if (hMem == NULL) return;
CreateStreamOnHGlobal(hMem , FALSE, &pStm );
if (pStm == NULL)
{
GlobalFree(hMem );
return;
}
// CString ---> IStream
ULONG cbWritten;
RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);//str.GetLength()pBuffer
IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(pStm,BUFFER_SIZE,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,65,40,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("图像失败!");
pPic->Release();
}
else
AfxMessageBox("装载图像失败!");
}
{
CString m_Path;
CFile m_file;
IStream *pStm;
CFileStatus fstatus;
CDC* pDC=this->GetDC();
HRESULT RES;
int BUFFER_SIZE=nLength;//sizeof(buf);
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, BUFFER_SIZE);
if (hMem == NULL) return;
CreateStreamOnHGlobal(hMem , FALSE, &pStm );
if (pStm == NULL)
{
GlobalFree(hMem );
return;
}
// CString ---> IStream
ULONG cbWritten;
RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);//str.GetLength()pBuffer
IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(pStm,BUFFER_SIZE,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,65,40,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("图像失败!");
pPic->Release();
}
else
AfxMessageBox("装载图像失败!");
}
解决方案 »
- 终于知道程序员是怎么累死的了
- 如何获取webbrowser内的DT内容
- 获取IP地址问题
- 如何在显式加载的dll中操控主程序界面中的控件?
- 如何控制sis SMbus 进行CPU超频,需代码
- 一消息的lParam的值为POINTS,我怎么转换lParam为POINTS,POINTS ss;ss=(POINTS)lParam编译不过
- 练手:我在学做一个计算器,不知道如何表示带小数点的数字,请大虾指教
- 怎么查询sqlserver中的时间日期?加 #好像不对啊.
- 请问怎么样把口令验证屏蔽?
- 请教高手:SetFocus()用在OnInitalDialog()为什么不行?
- 一个简单问题,如何让我做的Dialog置前,详情如下,谢谢!
- 如愿当上《图形/算法》版的斑竹,光散银两啦.......
HRESULT CommonDlgBase::get_picture(LPCTSTR restype,UINT resid,IPicture** pic)
{
HRSRC hResLoad = NULL; // handle to loaded resource
HMODULE hExe = NULL; // handle to existing .EXE file
HRSRC hRes = NULL; // handle/ptr. to res. info. in hExe
LPVOID lpResLock = NULL; // pointer to resource datahRes = FindResource(hExe, MAKEINTRESOURCE(resid), restype);
if (hRes == NULL)
{
return E_FAIL;
}
hResLoad = (HRSRC)LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
return E_FAIL;
}
lpResLock = LockResource(hResLoad);
if (lpResLock == NULL)
{
return E_FAIL;
}
int fileSize = SizeofResource(hExe, hRes);
//Verbose(_T("SizeofResource return %d"),fileSize);
CComPtr<IStream> pStream = NULL;
CreateStreamOnHGlobal(NULL,TRUE,&pStream);
if(pStream)
{
ULONG uwrite = 0;
pStream->Write(lpResLock, fileSize,&uwrite);
if(uwrite==fileSize)
{
LARGE_INTEGER li;
li.u.HighPart=0;
li.u.LowPart =0;
pStream->Seek( li,STREAM_SEEK_SET,0);
HRESULT hr=OleLoadPicture(pStream,0,TRUE,IID_IPicture,(LPVOID*)pic);
return hr;
}
}
else
return E_FAIL;
return 0;
}
BOOL AboutMe::OnEraseBkgnd(CDC* pDC)
{
IPicture* pPicture = m_pPicture;
if(pPicture)
{
long hmWidth,hmHeight; // HIMETRIC units
pPicture->get_Width(&hmWidth);
pPicture->get_Height(&hmHeight);
CSize sz(hmWidth,hmHeight);
pDC->HIMETRICtoDP(&sz);
CDC dcmem;
dcmem.CreateCompatibleDC(pDC);
CBitmap membmp;
CRect clientrc;
GetClientRect(&clientrc);
membmp.CreateCompatibleBitmap(pDC,clientrc.Width(),clientrc.Height());
CBitmap* pold=dcmem.SelectObject(&membmp);
pPicture->Render(dcmem.m_hDC,0,0,sz.cx,sz.cy,0,hmHeight,hmWidth,-hmHeight,NULL);
pDC->BitBlt(0,0,clientrc.Width(),clientrc.Height(),&dcmem,0,0,SRCCOPY);
dcmem.SelectObject(pold);
membmp.DeleteObject();
dcmem.DeleteDC();
return TRUE;
}
return CommonDlgBase::OnEraseBkgnd(pDC);
}
{
CComBSTR cbs((LPCSTR)s);
cbs.WriteToStream(ps);
}CString readcstring(IStream* ps)
{
CComBSTR cbs;
cbs.ReadFromStream(ps);
return (LPCSTR)(_bstr_t(cbs.Detach( ),false));
}
Write可能需要超出指定大小的内存空间,而你又禁止了重新分配内存。
Write()方法返回类型是HRESULT,返回0就是S_OK,说明write()本身调用是成功的你之所以不成功,是因为 if(SUCCEEDED(OleLoadPicture(pStm,BUFFER_SIZE,TRUE,IID_IPicture,(LPVOID*)&pPic)))这个函数(OleLoadPicture)调用失败,
你可能在上一篇帖子中忘记了一个关键的函数seek(),你可以再看一下我将// IStream -->CString 段代码(http://community.csdn.net/Expert/topic/3835/3835774.xml?temp=.2909357)中有一段
ULARGE_INTEGER pSeek;
LARGE_INTEGER dlibMove ={ 0 } ;
pStream->Seek(dlibMove,STREAM_SEEK_SET ,&pSeek);所以这里OleLoadPicture()会失败,是因为在你RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);//str.GetLength()pBuffer之后,stream的指针也指到stream的末尾了,如果你要读stream的内容,需要把stream的指针
重置到头部,所以你只要在Write()之后、OleLoadPicture()之前加上上面3行代码,就ok了