使用PX_Blob序列化_variant_t(VT_ARRAY|VT_UI1)出现的一些问题

green82 2013-06-26 10:08:17
编写了一个ACTIVEX控件,想要把一些文件序列化到该控件,这个控件在PPT中使用,但是始终无法序列化成功,希望大家能帮忙看看大概是什么问题,代码在下面,就是想实现类似FLASH控件的EmbedMovie=TRUE的功能,谢谢
//////////////
//代码如下

void CBrowserResOcxCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Resource(pPX);
}
void CBrowserResOcxCtrl::PX_Resource(CPropExchange* pPX)
{
//////////////////////////////////////////////////////////////////////////
if (pPX->GetVersion() == (DWORD)MAKELONG(_wVerMinor, _wVerMajor))
{
if(!pPX->IsLoading())
{
_variant_t vContent;
m_CreateHtml.CreateVariantFromFile(&vContent,....);
BYTE by[4];
DWORD dw = vContent.parray->rgsabound->cElements;
WORD h,l;
h = HIWORD(dw);
l = LOWORD(dw);
by[0] = LOBYTE(l);
by[1] = HIBYTE(l);
by[2] = LOBYTE(h);
by[3] = HIBYTE(h); ////////////////////////////////////////////////////////////////////////
m_hRes = GlobalAlloc(GPTR, dw+4);
if(m_hRes != NULL)
{
BYTE* pMem = (BYTE*)GlobalLock(m_hRes);
if(pMem!=NULL)
{
///*(DWORD*)pMem = dw;
pMem[0] = by[0];
pMem[1] = by[1];
pMem[2] = by[2];
pMem[3] = by[3];
BYTE* pTemp = NULL;
SafeArrayAccessData(vContent.parray, (void **)&pTemp);
for (int n=0;n<dwLen;n++)
{
BYTE by;
by = pTemp[n];
pMem[n+4]=pTemp[n];
}
BOOL f = PX_Blob(pPX, _T("BlobRes"),m_hRes);
SafeArrayUnaccessData(vContent.parray);
GlobalUnlock(m_hRes);
m_hRes = NULL;
}
else
{
HGLOBAL hTmp = NULL;
BOOL b = PX_Blob(pPX, _T("BlobRes"), hTmp);
}
GlobalFree(m_hRes);
m_hRes = NULL;
}
else
BOOL b = PX_Blob(pPX, _T("BlobRes"), m_hRes);
}
else
{
BOOL b = PX_Blob(pPX, _T("BlobRes"), m_hRes);
if(m_hRes!=NULL)
{
BYTE* pMem = (BYTE*)GlobalLock(m_hRes);
DWORD dwLen = GlobalSize(m_hRes);
_variant_t vContent;
HRESULT hr;
long lngOffset = 4;
UCHAR chData;
SAFEARRAY FAR *psa = NULL;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = dwLen-sizeof(DWORD);
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
while(lngOffset < dwLen-4)
{
chData = (UCHAR)(pMem[lngOffset]);
hr = SafeArrayPutElement(psa, &lngOffset, &chData);
if(FAILED(hr))
{
printf("错误");
}
lngOffset++;
}
vContent.vt = VT_ARRAY|VT_UI1;
vContent.parray = psa;
m_CreateHtml.CreateFileFromVariant(vContent,....);
GlobalUnlock(m_hRes);
}
GlobalFree(m_hRes);
m_hRes = NULL;

}
}


}
...全文
374 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
退色 2014-08-22
  • 打赏
  • 举报
回复
求解决的办法 急急急
蒋晟 2013-07-12
  • 打赏
  • 举报
回复
Global­Alloc可能分配比请求更多的空间,GlobalSize的结果不可作为原始数据长度。
green82 2013-07-11
  • 打赏
  • 举报
回复
谢谢关注和这个兄弟遇见的问题是一样的http://bbs.csdn.net/topics/320020209
aben456 2013-07-11
  • 打赏
  • 举报
回复
帮顶一下,不是很了解
green82 2013-06-26
  • 打赏
  • 举报
回复
@happyparrot @jiangsheng @VisualEleven帮帮忙哦
green82 2013-06-26
  • 打赏
  • 举报
回复
快来人啊
green82 2013-06-26
  • 打赏
  • 举报
回复
达人们来看看哦

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧