蚊子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;
}
复制代码
序列号存储是我们常用的文件存储方式,蚊子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;
}
复制代码
相关文章推荐
- 如何结合hibernate进行复杂的查询功能设计
- 如何高效的进行API Hook
- 如何进行高效JavaScript单元测试
- 如何高效进行OA系统选型
- 如何高效的对可移动物体进行四叉树管理
- 如何进行.NET高效开发?
- 如何进行高效的Rails单元测试
- 如何进行高效的Rails单元测试
- 如何高效地进行远程大规模字符串比较问题
- 存在datafile offline,如何进行异机恢复?
- 高效短眠的10个好处及如何进行高效的睡眠 (转)
- 如何在struts2中结合HttpClient进行文件上传
- [转]如何进行.NET高效开发
- 给定一个非常长的字节序列(假设有十亿或万亿),如何高效的统计1的个数
- 如何才能高效的进行CSS编码?
- 如何结合使用Subversion 和Eclipse进行SVN管理
- 如何进行高效的工作
- 存在datafile offline,如何进行异机恢复?
- 如何进行高效JavaScript单元测试
- 如何结合用户的兴趣和能力进行更好的众测分配