|
达人给看下下面代码的错误:
HRESULT hr ;
CString sql = L"select * from userphoto";
long lFieldsCount=0;//字段个数
long bmpSize;//图像数据长度
VARIANT varData,varFieldSelect;
VariantInit(&varData);
VariantInit(&varFieldSelect);
hr = db.m_pRecordSet->Open(sql);//db为一个数据库操作的类。m_pRecordSet为一个CVORecordSet对象
//里面有_Recordset指针变量
if(SUCCEEDED(hr))
MessageBox(_T("获取数据成功"));
if(FAILED(hr))
MessageBox(_T("获取数据失败!"));
hr=db.m_pRecordSet->m_rsRecordSet->get_Fields(&m_Fields);//m_Fields为Fields *对象
hr=m_Fields->get_Count(&lFieldsCount);
varFieldSelect.uiVal = 2;//字段2为image 类型的photo
varFieldSelect.vt = VT_UI2;
hr=m_Fields->get_Item(varFieldSelect,&m_Field);//m_Field为Field*对象
m_Field->get_ActualSize(&bmpSize);//获取数据长度
char *m_pBuffer;
if(bmpSize>0)
{
VARIANT varBLOB;
VariantInit(&varBLOB);
hr=m_Field->GetChunk(bmpSize,&varBLOB);//获取数据
if(varBLOB.vt==(VT_ARRAY | VT_UI1))
{
if(m_pBuffer=new char[bmpSize+1])
{
MessageBox(_T("fen pei cheng gong "));
TCHAR*pBuf=NULL;
hr=SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
MessageBox(pBuf);//输出的是串看不懂的乱码
memcpy(m_pBuffer,pBuf,bmpSize);
MessageBox((TCHAR*)m_pBuffer);
SafeArrayUnaccessData(varBLOB.parray);
}
}
}
LPSTR hDIB;
LPVOID lpDIBBits;
//用于保存BMP头文件信息,包括类型大小位置
BITMAPFILEHEADER bmpHeader;
DWORD bmpHeaderLen;
bmpHeaderLen=sizeof(bmpHeader);
//将m_pBuffer文件头复制到bmpHeader中
strncpy((LPSTR)&bmpHeader,(LPSTR)m_pBuffer,bmpHeaderLen);
//MessageBox(_T("chenggong"));
if(bmpHeader.bfType!=(*(WORD*)"BM"))
{
MessageBox(_T("bmp 格式不正确"));
return;
}
else
MessageBox(_T("BMP格式正确"));
hDIB=m_pBuffer+bmpHeaderLen;//将指针移至头文件后面
//读取BMP文件的图像数据
//包括坐标及颜色格式等信息到BITMAPINFOHEADER对象
BITMAPINFOHEADER &bmiHeader=*(LPBITMAPINFOHEADER)hDIB;
//读取BMP文件的图像数据,包括颜色坐标及格式信息到BITMAPINFO对象
BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB;
//根据bfOffBits属性将指针移至文件头后
lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER*)m_pBuffer)->bfOffBits;
CClientDC cdc(this);
//m_hPhotoBitmap=CreateDIBitmap(cdc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,
// &bmInfo,DIB_RGB_COLORS);
//VC中用的函数。EVC中没有。EVC只有下面的函数
m_hPhotoBitmap=CreateDIBSection(cdc,&bmInfo,DIB_RGB_COLORS,(void**)lpDIBBits,NULL,0);
if(m_hPhotoBitmap==NULL)
MessageBox(_T("创建位图失败"));
else
MessageBox(_T("创建位图成功"));
//绘制图形到客户区
HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
OldBitmap=(HBITMAP)MemDC.SelectObject(m_hPhotoBitmap);
pDC->BitBlt(x,y,100,130,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
以上是自己写的获取SQLCE 数据库图像数据并显示的代码。m_hPhotoBitmap为HBITMAP对象。
但绘制出来时一个黑框。把数据转化为图像的代码是参考VC6.0写的。VC中能正确显示。EVC不能。
也读出了数 据,不知道读的是否正确。两天了,不知道哪个地方有错误。贴出来大家讨论下。
先不说代码对错, 这种思路应该没什么问题吧? |
|