WPS文本域替换不完全的问题
2012-08-10 02:19
190 查看
前段时间用户反馈我们的一个Active-X控件在对WPS文档进行文本域操作时无法完全替换值,但是在WORD中不存在该问题。通常来说WPS的许多接口都和WORD相同,DISPID也几乎一致(WPS Document的Application的DISPID和WORD不同,一个是0x000003e8而另一个是0×00000001)。于是将替换核心代码抽出做成一个命令行工具进行测试,代码如下:
测试环境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);
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);
相关文章推荐
- 解决老版本eclipse无法完全替换主题的问题
- 【Unity精灵】2D精灵图片替换常见的问题
- jsp页面textarea中换行替换问题
- DIV border边框显示不完全问题的解决方法
- 【NP-完全问题】Is STINGY SAT problem NP-complete?
- HihoCoder第七周:完全背包问题
- NP完全问题 8.12
- git@Osc当中怎么把一个分支的内容完全替换成另一个分支的内容
- go中利用hmset替换hset来提高redis的存取效率及并发goroutine可能遇到的问题
- 完全背包问题
- c++关于接口机制和不完全类型的小问题
- HDU 1284 钱币兑换问题 (完全背包)
- 第一周第三天([算式][九九乘法表][求素数][求1000以内数相加但尾数是三的数跳出不计算][生小兔子问题] [金字塔问题] [求1+3+...+(2^20-1)的值][求1000以内的完全数])
- ExpandableListView嵌套ListView导致ListView不能完全显示数据的问题
- UVA 147 Dollars 刀了(完全背包,精度问题)
- 数据结构经典算法学习之完全背包问题
- eclipse-ubuntu14.04图标替换不掉的问题
- JZOJ4916. 完全背包问题
- 利用替换SAM文件的方式破解XP登陆密码,解决无法登陆系统的问题
- 完全背包问题