您的位置:首页 > 其它

WPS文本域替换不完全的问题

2012-08-10 02:19 190 查看
前段时间用户反馈我们的一个Active-X控件在对WPS文档进行文本域操作时无法完全替换值,但是在WORD中不存在该问题。通常来说WPS的许多接口都和WORD相同,DISPID也几乎一致(WPS Document的Application的DISPID和WORD不同,一个是0x000003e8而另一个是0×00000001)。于是将替换核心代码抽出做成一个命令行工具进行测试,代码如下:

std::wcout.imbue(std::locale(“chs”));

#ifndef DEBUG
wcout << *(argv + 1) << endl;
#endif

CComPtr<IOleObject> pole  = NULL;
CComPtr<IBindCtx> pbctx   = NULL;
CComPtr<IMoniker> pmkfile = NULL;
HRESULT hr = S_OK;
BIND_OPTS bopts = { sizeof(BIND_OPTS), BIND_MAYBOTHERUSER, 0, 10000 };

#ifdef DEBUG
LPOLESTR pwszFile = _T(“E:\\Test.wps”);
#else
LPOLESTR pwszFile = *(argv + 1);
#endif

bopts.grfMode = (STGM_TRANSACTED | STGM_SHARE_DENY_WRITE | STGM_READWRITE);

::CoInitialize(NULL);

hr = CreateBindCtx(0, &pbctx);
hr = pbctx->SetBindOptions(&bopts);
hr = CreateFileMoniker(pwszFile, &pmkfile);
hr = pmkfile->BindToObject(pbctx, NULL, IID_IOleObject, (void**)&pole);

CComPtr<IDispatch> pdisp;
CComPtr<IDispatch> pFields;

hr = pole.QueryInterface<IDispatch>(&pdisp);
hr = Marshal::GetIDispatchProperty(pdisp, DISP_DOCUMENT_FIELDS, &pFields);

LONG lCount;

hr = Marshal::GetCollectionCount(pFields, &lCount);

printf(“Field count = %ld\r\n”, lCount);

for (LONG i = 1; i <= lCount; ++i) {
CComPtr<IDispatch> pField, pCode, pResult;
CComBSTR strText;
LONG lStart, lEnd;

Marshal::GetCollectionItem2(pFields, i, &pField);
Marshal::GetIDispatchProperty(pField, DISP_FIELD_CODE, &pCode);
Marshal::GetBSTRTypeProperty(pCode, DISP_RANGE_TEXT, &strText);
Marshal::GetI8TypeProperty(pCode, DISP_RANGE_START, &lStart);
Marshal::GetI8TypeProperty(pCode, DISP_RANGE_END, &lEnd);

wcout << lStart << _T(” “) << lEnd << _T(” “);
wcout << wstring(strText) << endl;

Marshal::GetIDispatchProperty(pField, DISP_FIELD_RANGE, &pResult);
Marshal::PutBSTRTypeProperty(pResult, DISP_RANGE_TEXT, CComBSTR(_T(“hello, world”)));
}

CComPtr<IPersistFile> ppfile;

hr = pole.QueryInterface<IPersistFile>(&ppfile);
hr = ppfile->Save(pwszFile, TRUE);

wcout << _T(“保存成功”) << endl;

::CoUninitialize();

getchar();

return 0;


测试环境1:Windows Server 2008 R2 64位 + WPS Office 2009专业版

测试结果:一个有11个文本域的文档只替换了6个

测试环境2:Windows Server 2008 32位 + Microsoft Office 2007

测试结果:一个有11个文本域的文档全部替换成功

测试环境3:Windows 7 64位 + Microsoft Office 2010

测试结果:一个有11个文本域的文档全部替换成功

测试环境4:Windows XP 32位 + WPS Office 2009专业版

测试结果:一个有11个文本域的文档只替换了6个

之前金山研发人员确认用WORD的方式没有问题,但多次测试结果表明WORD的文本域替换在WPS中无法完全奏效。WPS需要在设置Result.Text属性前,调用Collapse函数才可以完成替换:pResult.Invoke0(DISP_RANGE_COLLAPSE);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: