这是我的代码,总是提示文件格式不正确,不知道是怎么回事,高手帮忙看下,谢谢!!
HBITMAP m_hBitmap;
long lDataSize = pRs->GetFields()->GetItem("Photo")->ActualSize;
char *m_pBuffer;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB =pRs->GetFields()->GetItem("Photo")->GetChunk(lDataSize);
//varBLOB=pRs->GetCollect("Photo");
if(varBLOB.vt==(VT_ARRAY | VT_UI1))
{
if(m_pBuffer = new char[lDataSize+1])
{
char * pBuf=NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBuffer,pBuf,lDataSize); //复制数据到缓冲区m_pBuffer
SafeArrayUnaccessData(varBLOB.parray); LPSTR hDIB;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader; DWORD bmfHeaderLen;
bmfHeaderLen=sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen);
if(bmfHeader.bfType!= (*(WORD *)"BM"))
{
MessageBox("BMP文件格式不正确");
return;
} hDIB=m_pBuffer+bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader =*(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB;
lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
CClientDC dc(this);
m_hBitmap=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
delete []m_pBuffer;
}
}
}
HBITMAP m_hBitmap;
long lDataSize = pRs->GetFields()->GetItem("Photo")->ActualSize;
char *m_pBuffer;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB =pRs->GetFields()->GetItem("Photo")->GetChunk(lDataSize);
//varBLOB=pRs->GetCollect("Photo");
if(varBLOB.vt==(VT_ARRAY | VT_UI1))
{
if(m_pBuffer = new char[lDataSize+1])
{
char * pBuf=NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBuffer,pBuf,lDataSize); //复制数据到缓冲区m_pBuffer
SafeArrayUnaccessData(varBLOB.parray); LPSTR hDIB;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader; DWORD bmfHeaderLen;
bmfHeaderLen=sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen);
if(bmfHeader.bfType!= (*(WORD *)"BM"))
{
MessageBox("BMP文件格式不正确");
return;
} hDIB=m_pBuffer+bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader =*(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB;
lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
CClientDC dc(this);
m_hBitmap=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
delete []m_pBuffer;
}
}
}
HBITMAP m_hBitmap;
long lDataSize = pRs->GetFields()->GetItem("Photo")->ActualSize;
char *m_pBuffer;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB =pRs->GetFields()->GetItem("Photo")->GetChunk(lDataSize);
//varBLOB=pRs->GetCollect("Photo");
if(varBLOB.vt==(VT_ARRAY | VT_UI1))
{
if(m_pBuffer = new char[lDataSize+1])
{
char * pBuf=NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBuffer,pBuf,lDataSize); //复制数据到缓冲区m_pBuffer
SafeArrayUnaccessData(varBLOB.parray); LPSTR hDIB;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader; DWORD bmfHeaderLen;
bmfHeaderLen=sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)m_pBuffer,bmfHeaderLen);
if(bmfHeader.bfType!= (*(WORD *)"BM"))
{
MessageBox("BMP文件格式不正确");
return;
} hDIB=m_pBuffer+bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader =*(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo=*(LPBITMAPINFO)hDIB;
lpDIBBits=(m_pBuffer)+((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
CClientDC dc(this);
m_hBitmap=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
delete []m_pBuffer;
}
}
}
红色那行改成用 memcpy
若果中间有'\0',使用strncpy会被截断,拷贝不倒bmfHeaderLen个字节
void CDialogPicture::OnBnClickedButtonSave()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
if(m_strName.IsEmpty())
{
MessageBox("姓名不能为空","提示");
m_edName.SetFocus();
return;
}
char * m_pBuffer; //从BMP文件中读取的数据存放在此变量中
CFile file;
if(!file.Open(strPath,CFile::modeRead)) //strPath是利用文件对话框获取的路径
{
MessageBox("文件无法打开");
}
DWORD m_filelen; //用于保存文件长度
m_filelen=file.GetLength();
m_pBuffer=new char[m_filelen+1]; //根据文件长度分配数组空间 try
{
_ConnectionPtr pConn = NULL;
_RecordsetPtr pRs = NULL;
CString strSQL;
CString strConnect = _T("Provider=SQLOLEDB.1; Data Source=") + theApp.m_strDBsrc +
_T("; Initial Catalog=") + theApp.m_strDBname +
_T("; User ID=") + theApp.m_strDBusr +
_T("; PWD=") + theApp.m_strDBpwd; if( FAILED( pConn.CreateInstance( __uuidof(Connection ) ) ) )
{ AfxMessageBox( "fdfdf" , MB_OK|MB_ICONEXCLAMATION, 0 ); ASSERT(pConn != NULL); return ;
} if( FAILED( pRs.CreateInstance( __uuidof(Recordset ) ) ) )
{ AfxMessageBox( "fdfdsf" , MB_OK|MB_ICONEXCLAMATION, 0 ); ASSERT(pRs != NULL); return ;
}
pConn->Open(_bstr_t(LPCTSTR(strConnect)), "", "",adConnectUnspecified); strSQL.Format( _T("SELECT * FROM picture")); pRs->PutCursorLocation(adUseClient); // 支持光标
pRs->Open( _bstr_t(strSQL), _variant_t((IDispatch *)pConn, true), adOpenStatic, adLockOptimistic, adCmdText);
pRs->AddNew();
VARIANT varblob;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=m_filelen;
psa=SafeArrayCreate(VT_UI1,1,rgsabound);
for(long i=0;i<(long)m_filelen;i++)
{
SafeArrayPutElement(psa,&i,m_pBuffer++);
}
varblob.vt=VT_ARRAY|VT_UI1;
varblob.parray=psa;
pRs->PutCollect("Name",(_variant_t)m_strName);
pRs->GetFields()->GetItem("Photo")->AppendChunk(varblob); pRs->Update(); MessageBox("添加成功!");
pRs->Close();
pConn->Close();
}
catch(_com_error e)
{
MessageBox(e.Description());
}}
然后通过对比你的bmp hex,看看保存是否正确再说。