:Excel嵌入Activex 保存数据的有关问题

求救:Excel嵌入Activex 保存数据的问题
本帖最后由 MRD1317011511 于 2014-11-10 16:43:14 编辑
代码如下:
HRESULT IPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty,const ATL_PROPMAP_ENTRY* pMap)
{
if (NULL == pStm) 
return E_POINTER;

HRESULT hr = IPersistStreamInitImpl<XXX>::IPersistStreamInit_Save(pStm,  fClearDirty, pMap);
if (FAILED (hr)) 
return hr;

LONG len = 0;
LARGE_INTEGER li;
ULARGE_INTEGER ui;
li.QuadPart = 0;
pStm->Seek(li,STREAM_SEEK_CUR,&ui);//得到当前位置,存在ui里
pStm->Write(&len,sizeof(len),NULL);//写进占个位置
SaveProperties(pStm);    //保存其它属性。
li.QuadPart = ui.QuadPart;
pStm->Seek(li,STREAM_SEEK_SET,NULL);
pStm->Write(&len,sizeof(len),NULL);

m_bSaved = TRUE;
fClearDirty = TRUE;
return S_OK;
}

HRESULT IPersistStreamInit_Load(LPSTREAM pStm, const ATL_PROPMAP_ENTRY* pMap)
{
if (NULL == pStm) 
return E_POINTER;

HRESULT hr = IPersistStreamInitImpl<XXX>::IPersistStreamInit_Load(pStm, pMap);
if (FAILED (hr)) 
return hr;

LONG len = 0;
pStm->Read(&len,sizeof(len),NULL);

LoadProperties(pStm);

this->SetExtent(DVASPECT_CONTENT ,&m_sizeExtent);
if (SUCCEEDED(hr))
 m_bRequiresSave = FALSE;
SendOnDataChange();
return S_OK;
}

Excel中,当插入一个ActiveX对象,保存读取数据正常,当插入第二个或是多个,数据保存却不正常,永远都只能保存最后一Activex的数据和读取最后一个Activex的数据。
当然在xlsx格式下是正常,无论插入多少Activex都能保存和读取。
就是在xls格式下不正常,只能保存最后一个Activex的数据。
请问是怎么回事。
------解决思路----------------------
引用:
代码如下:
HRESULT IPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty,const ATL_PROPMAP_ENTRY* pMap)
{
if (NULL == pStm) 
return E_POINTER;

HRESULT hr = IPersistStreamInitImpl<XXX>::IPersistStreamInit_Save(pStm,  fClearDirty, pMap);
if (FAILED (hr)) 
return hr;

LONG len = 0;
LARGE_INTEGER li;
ULARGE_INTEGER ui;
li.QuadPart = 0;
pStm->Seek(li,STREAM_SEEK_CUR,&ui);//得到当前位置,存在ui里
pStm->Write(&len,sizeof(len),NULL);//写进占个位置
SaveProperties(pStm);    //保存其它属性。
li.QuadPart = ui.QuadPart;
pStm->Seek(li,STREAM_SEEK_SET,NULL);
pStm->Write(&len,sizeof(len),NULL);

m_bSaved = TRUE;
fClearDirty = TRUE;
return S_OK;
}

HRESULT IPersistStreamInit_Load(LPSTREAM pStm, const ATL_PROPMAP_ENTRY* pMap)
{
if (NULL == pStm) 
return E_POINTER;

HRESULT hr = IPersistStreamInitImpl<XXX>::IPersistStreamInit_Load(pStm, pMap);
if (FAILED (hr)) 
return hr;

LONG len = 0;
pStm->Read(&len,sizeof(len),NULL);

LoadProperties(pStm);

this->SetExtent(DVASPECT_CONTENT ,&m_sizeExtent);
if (SUCCEEDED(hr))
 m_bRequiresSave = FALSE;
SendOnDataChange();
return S_OK;
}

Excel中,当插入一个ActiveX对象,保存读取数据正常,当插入第二个或是多个,数据保存却不正常,永远都只能保存最后一Activex的数据和读取最后一个Activex的数据。
当然在xlsx格式下是正常,无论插入多少Activex都能保存和读取。
就是在xls格式下不正常,只能保存最后一个Activex的数据。
请问是怎么回事。

首先你需要指定插入的位置,然后定义一些变量保存数据插入后,下一次写入的位置,excle写入的时候是按照指定的“行和列”写入的。
------解决思路----------------------
你ActiveX有没有一个管理对象的接口?!
也就是说你代码里面需要管理你运行着的多个ActiveX控件对象,这样子ActiveX之间有些数据才不会造成冲突!