WPS文本域替换不完全的问题
前段時間用戶反饋我們的一個Active-X控件在對WPS文檔進行文本域操作時無法完全替換值,但是在WORD中不存在該問題。通常來說WPS的許多接口都和WORD相同,DISPID也幾乎一致(WPS Document的Application的DISPID和WORD不同,一個是0x000003e8而另一個是0×00000001)。于是將替換核心代碼抽出做成一個命令行工具進行測試,代碼如下:
2 std::wcout.imbue(std::locale(“chs”)); 3 4 #ifndef DEBUG 5 wcout << *(argv + 1) << endl; 6 #endif 7 8 CComPtr<IOleObject> pole = NULL; 9 CComPtr<IBindCtx> pbctx = NULL; 10 CComPtr<IMoniker> pmkfile = NULL; 11 HRESULT hr = S_OK; 12 BIND_OPTS bopts = { sizeof(BIND_OPTS), BIND_MAYBOTHERUSER, 0, 10000 }; 13 14 #ifdef DEBUG 15 LPOLESTR pwszFile = _T(“E:\\Test.wps”); 16 #else 17 LPOLESTR pwszFile = *(argv + 1); 18 #endif 19 20 bopts.grfMode = (STGM_TRANSACTED | STGM_SHARE_DENY_WRITE | STGM_READWRITE); 21 22 ::CoInitialize(NULL); 23 24 hr = CreateBindCtx(0, &pbctx); 25 hr = pbctx->SetBindOptions(&bopts); 26 hr = CreateFileMoniker(pwszFile, &pmkfile); 27 hr = pmkfile->BindToObject(pbctx, NULL, IID_IOleObject, (void**)&pole); 28 29 CComPtr<IDispatch> pdisp; 30 CComPtr<IDispatch> pFields; 31 32 hr = pole.QueryInterface<IDispatch>(&pdisp); 33 hr = Marshal::GetIDispatchProperty(pdisp, DISP_DOCUMENT_FIELDS, &pFields); 34 35 LONG lCount; 36 37 hr = Marshal::GetCollectionCount(pFields, &lCount); 38 39 printf(“Field count = %ld\r\n”, lCount); 40 41 for (LONG i = 1; i <= lCount; ++i) { 42 CComPtr<IDispatch> pField, pCode, pResult; 43 CComBSTR strText; 44 LONG lStart, lEnd; 45 46 Marshal::GetCollectionItem2(pFields, i, &pField); 47 Marshal::GetIDispatchProperty(pField, DISP_FIELD_CODE, &pCode); 48 Marshal::GetBSTRTypeProperty(pCode, DISP_RANGE_TEXT, &strText); 49 Marshal::GetI8TypeProperty(pCode, DISP_RANGE_START, &lStart); 50 Marshal::GetI8TypeProperty(pCode, DISP_RANGE_END, &lEnd); 51 52 wcout << lStart << _T(” “) << lEnd << _T(” “); 53 wcout << wstring(strText) << endl; 54 55 Marshal::GetIDispatchProperty(pField, DISP_FIELD_RANGE, &pResult); 56 Marshal::PutBSTRTypeProperty(pResult, DISP_RANGE_TEXT, CComBSTR(_T(“hello, world”))); 57 } 58 59 CComPtr<IPersistFile> ppfile; 60 61 hr = pole.QueryInterface<IPersistFile>(&ppfile); 62 hr = ppfile->Save(pwszFile, TRUE); 63 64 wcout << _T(“保存成功”) << endl; 65 66 ::CoUninitialize(); 67 68 getchar(); 69 70 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);
轉載于:https://www.cnblogs.com/junchu25/archive/2012/08/10/2631154.html
總結
以上是生活随笔為你收集整理的WPS文本域替换不完全的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么程序员不擅长估算时间?
- 下一篇: 将近一半的用户希望能够在两秒内或者更短的