您的位置:首页 > 其它

蚊子132 如何结合 CMenFile 与 CArchive 进行高效的序列 ...

2014-05-29 09:25 295 查看
来源:蚊子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;

}

复制代码

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: