void CBMPdatDlg::OnButtonWrite() 
{
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
LPCTSTR szFilter = "BMP Files (*.bmp)|*.bmp||"; CFileDialog dlg(TRUE, NULL, NULL, dwFlags, szFilter);

if (dlg.DoModal() == IDOK)
{
const int nBlockSize = 1024;
BYTE *pBuf = (BYTE *) new BYTE [nBlockSize]; CString szBMPFile = dlg.GetPathName (); CFile file;
if (!file.Open(szBMPFile, CFile::modeRead))
return;

int nFileSize = file.GetLength ();
int nReadSize = (nBlockSize < nFileSize) ? nBlockSize : nFileSize; VARIANT varBLOB; while (nReadSize > 0)
{
file.Read (pBuf, nReadSize);
BYTE *pBufEx = pBuf; SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nReadSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < nReadSize; i++)
SafeArrayPutElement (psa, &i, pBufEx++); varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa; pRs->GetFields()->GetItem("Pic")->AppendChunk (varBLOB); nFileSize -= nReadSize;
nReadSize = (nBlockSize < nFileSize) ? nBlockSize : nFileSize;
} pRs->Update ();
file.Close ();
delete[] pBuf;
}
}void CBMPdatDlg::OnButtonRead() 
{
_variant_t varBLOB;
VariantInit (&varBLOB); long lDataLength = pRs->GetFields()->GetItem("Pic")->ActualSize;
varBLOB = pRs->GetFields()->GetItem("Pic")->GetChunk (lDataLength); if(varBLOB.vt == (VT_ARRAY | VT_UI1))
    {
BYTE *pBuf = NULL; SafeArrayAccessData (varBLOB.parray,(void **)&pBuf); CFile file;
file.Open("d:\\abc.bmp", CFile::modeCreate|CFile::modeWrite);
file.Write (pBuf, lDataLength);
file.Close (); SafeArrayUnaccessData (varBLOB.parray);
}
}