来源:蚊子132 如何结合 CMenFile 与 CArchive 进行高效的序列 ...
序列号存储是我们常用的文件存储方式,蚊子132 这篇文章介绍如何结合 CMenFile 与 CArchive 进行高效的序列号存储。
BYTE * ppBuf;
long pcBufLen;
CMemFile file(ppBuf,pcBufLen);
CArchive ar(&file,CArchive::load);
将CArchive 与COleVariant相互转换就可以在内存文件存入到数据库大字段中
下面是COleVariant与BYTE 转换:
- //Extensive error checking is left out to make the code more readable
- BOOL GetBinaryFromVariant(COleVariant & ovData, BYTE ** ppBuf,
- unsigned long * pcBufLen)
- {
- BOOL fRetVal = FALSE;
- //Binary data is stored in the variant as an array of unsigned char
- if(ovData.vt == (VT_ARRAY|VT_UI1)) // (OLE SAFEARRAY)
- {
- //Retrieve size of array
- *pcBufLen = ovData.parray->rgsabound[0].cElements;
- *ppBuf = new BYTE[*pcBufLen]; //Allocate a buffer to store the data
- if(*ppBuf != NULL)
- {
- void * pArrayData;
- //Obtain safe pointer to the array
- SafeArrayAccessData(ovData.parray,&pArrayData);
- //Copy the bitmap into our buffer
- memcpy(*ppBuf, pArrayData, *pcBufLen);
- //Unlock the variant data
- SafeArrayUnaccessData(ovData.parray);
- fRetVal = TRUE;
- }
- }
- return fRetVal;
- }
- BOOL PutBinaryIntoVariant(COleVariant * ovData, BYTE * pBuf,
- unsigned long cBufLen)
- {
- BOOL fRetVal = FALSE;
- VARIANT var;
- VariantInit(&var); //Initialize our variant
- //Set the type to an array of unsigned chars (OLE SAFEARRAY)
- var.vt = VT_ARRAY | VT_UI1;
- //Set up the bounds structure
- SAFEARRAYBOUND rgsabound[1];
- rgsabound[0].cElements = cBufLen;
- rgsabound[0].lLbound = 0;
- //Create an OLE SAFEARRAY
- var.parray = SafeArrayCreate(VT_UI1,1,rgsabound);
- if(var.parray != NULL)
- {
- void * pArrayData = NULL;
- //Get a safe pointer to the array
- SafeArrayAccessData(var.parray,&pArrayData);
- //Copy bitmap to it
- memcpy(pArrayData, pBuf, cBufLen);
- //Unlock the variant data
- SafeArrayUnaccessData(var.parray);
- *ovData = var; // Create a COleVariant based on our variant
- VariantClear(&var);
- fRetVal = TRUE;
- }
- return fRetVal;
- }
- //How you might call these functions
- CdbRecordset rs;
- //Code for initializing DAO and opening the recordset left out...
- COleVariant ovData = rs.GetField(_T("MyBinaryField"));
- BYTE * pBuf = NULL;
- unsigned long cBufLen;
- if(GetBinaryFromVariant(ovData,&pBuf,&cBufLen))
- {
- //Do something with binary data in pBuf...
- //Write back a new record containing the binary data
- COleVariant ovData2;
- if(PutBinaryIntoVariant(&ovData2,pBuf,cBufLen))
- {
- rs.AddNew();
- rs.SetField(_T("MyBinaryField"), ovData2); //Write our COleVariant
- to the table
- rs.Update();
- }
- //Clean up memory allocated by GetBinaryFromVariant
- if(pBuf)
- delete pBuf;
- }