从sql数据库中取image类型数据并显示的有关问题
从sql数据库中取image类型数据并显示的问题
我想把sql数据库中的image类型数据取出来,并显示在控件中,以下是找的一段代码,可以取出来但无法显示,望各位帮忙
_StreamPtr pStm;
pStm.CreateInstance( "ADODB.Stream ");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStm-> PutType(adTypeBinary);//类型为二进制
//得到字段内容的大小
// long lDataSize = m_pRecordset-> GetFields()-> GetItem( "photo ")-> ActualSize;
//m_pRecordset为一个打开的纪录集对象,含有photo这个blob字段
pStm-> Open(varOptional,adModeUnknown,adOpenStreamUnspecified,_bstr_t(),_bstr_t());
//打开pStm
pStm-> Write(_variant_t(m_pRecordset-> GetFields()-> GetItem( "receiptPath ")-> Value));
//把photo字段的内容写入pStm,保存到磁盘,可以实现
//pStm-> SaveToFile( "d:\\publogo.jpg ",adSaveCreateOverWrite);
//以下是将图片显示出来的代码,有问题,不知道怎么改
//variant_t varBLOB=pStm-> Read(adReadAll);
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,pStm-> GetSize());
LPVOID pvData=NULL;
IStream *ps;
if(hGlobal!=NULL)
{
_variant_t varBLOB;
if((pvData=GlobalLock(hGlobal))!=NULL)
{
char *m_pBMPBuffer=new char[pStm-> GetSize()+1];//分配必要的存储空间
char *pBuf=NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pvData,pBuf,pStm-> GetSize()); //复制数据到缓冲区 m_pBMPBuffer
SafeArrayUnaccessData(varBLOB.parray);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&ps);
}
}
IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(ps,pStm-> GetSize(),TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic-> get_Width(&hmWidth);
pPic-> get_Height(&hmHeight);
double fX,fY;
CDC *pDC=GetDlgItem(IDC_PICTURE)-> GetDC();///这里是获取控件DC
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,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
我想把sql数据库中的image类型数据取出来,并显示在控件中,以下是找的一段代码,可以取出来但无法显示,望各位帮忙
_StreamPtr pStm;
pStm.CreateInstance( "ADODB.Stream ");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStm-> PutType(adTypeBinary);//类型为二进制
//得到字段内容的大小
// long lDataSize = m_pRecordset-> GetFields()-> GetItem( "photo ")-> ActualSize;
//m_pRecordset为一个打开的纪录集对象,含有photo这个blob字段
pStm-> Open(varOptional,adModeUnknown,adOpenStreamUnspecified,_bstr_t(),_bstr_t());
//打开pStm
pStm-> Write(_variant_t(m_pRecordset-> GetFields()-> GetItem( "receiptPath ")-> Value));
//把photo字段的内容写入pStm,保存到磁盘,可以实现
//pStm-> SaveToFile( "d:\\publogo.jpg ",adSaveCreateOverWrite);
//以下是将图片显示出来的代码,有问题,不知道怎么改
//variant_t varBLOB=pStm-> Read(adReadAll);
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,pStm-> GetSize());
LPVOID pvData=NULL;
IStream *ps;
if(hGlobal!=NULL)
{
_variant_t varBLOB;
if((pvData=GlobalLock(hGlobal))!=NULL)
{
char *m_pBMPBuffer=new char[pStm-> GetSize()+1];//分配必要的存储空间
char *pBuf=NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pvData,pBuf,pStm-> GetSize()); //复制数据到缓冲区 m_pBMPBuffer
SafeArrayUnaccessData(varBLOB.parray);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&ps);
}
}
IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(ps,pStm-> GetSize(),TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic-> get_Width(&hmWidth);
pPic-> get_Height(&hmHeight);
double fX,fY;
CDC *pDC=GetDlgItem(IDC_PICTURE)-> GetDC();///这里是获取控件DC
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,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))