char *pBuff;//用于存放位图的内存空间
CString str="select * from Picture";//SQL语句^_^
BSTR bstrRecordset=str.AllocSysString();//这句也不用解释了吧
HBITMAP hBitmap;//定义一个HBITMAP对象,用于显示位图用
try
{
pRecordset->Open(bstrRecordset,pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
pRecordset->MoveLast();
TheValue=pRecordset->GetCollect("Picture");//读取字段一
DataSize=pRecordset->GetFields()->GetItem("Picture")->ActualSize;//得到位图字段的大小
if(DataSize>0)//判断那个位图字段是否为空
{
if(TheValue.vt==(VT_ARRAY|VT_UI1))
{
if(pBuff=new char[DataSize+1])
{
char *buff;
/***********************主要也就下面这几句画,其它的和显示位图相似**************************/
SafeArrayAccessData(TheValue.parray,(void**)&buff);//把位图数据放到buff中去
memcpy(pBuff,buff,DataSize);//把位图数据放到pBuff中
SafeArrayUnaccessData(TheValue.parray);//释放
hBitmap=MemTOPic(pBuff);//这是一个自字义
}
}
}
}
catch(_com_error e)
{
MessageBox("打开数据表失败!");
return ;
}
/******************根据HBITMAP把位图显示出来************************/
CBitmap cBitmap;
CClientDC *pDC=new CClientDC(this);
BITMAP bitmap;
CDC MemDC;
cBitmap.Attach(hBitmap);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&cBitmap);
cBitmap.GetBitmap(&bitmap);
pDC->StretchBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&MemDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
MemDC.DeleteDC();
::DeleteObject(&bitmap);
/*************自定义函数************把内存数据转为HBITMAP***************************/
HBITMAP CDBPicDllDlg::MemTOPic(char *buff)
{
HBITMAP hBitmap=NULL;
LPSTR hDib=NULL;
LPSTR PicBuff=NULL;
PicBuff=buff;
LPVOID pDibBit=NULL;
BITMAPFILEHEADER bmpHead;//位图头结构
DWORD LenBmpHead;
LenBmpHead=sizeof(BITMA