« 十津川警部…… | トップページ | WinMerge用プラグイン公開その2 »

2004.12.27

WordのCOMではまる。

>> WinMerge用プラグイン公開に書いたとおりに,Word→Textを実装した。
これでWordのdocもテキストとして比較できる。

でも,WinMergeの仕様がイマイチスマートじゃない気がする。
個々のプラグインが拡張子を登録できるんだけど,それが,プラグインの名前順になっている。
それでもって,docが標準のDisplayBinaryFiles.dllって前のほうの名前で汎用的に実装されてる。
なんで,doc専用のをAWordToText.dllってなふうに強引に前にするしかない。
並び替えを持っててくれれば……とも思うけど,とりあえず,強引に逃げる。

#Linuxのdeamonみたいにシンボリックリンクで番号つけてってのもWindowsなんでできない……

そんなこともありつつ,忘れないようにはまった話を書いておく。

最初は,progid="Word.Application"でロードして,Open(doc)して,SaveAs(text)してやればさくっと終わるかと思ったけど,手間取った。
コアな部分は,そのとおりなんだけど,毎回解放(というか,Quit←しないとexeが残る)すると,ロードのときに,毎回起動するんで,重くなる。

で,ロードしっぱなしにする必要がある。
プラグインのCOMクラス中で持っとけばよいかとも思ったけど,WinMergeではプラグインのCOMオブジェクトは,毎回生成される。
ということで,CComModuleから派生させたクラス内で,"Word.Application"なCOMを保持するようにした。
そうすると,オブジェクト生成の時間が短縮される。

#CComModule:CWinAppに相当。DLLを表現するクラス。(と思えばよい?)

しかし,差分検出後,詳細を見ようとすると,落ちる……
よくわからんけど,保持したWordのCOMオブジェクトが使えなくなるらしい……

さんざん,ぐだぐだしたあげく,「CO_E_OBJNOTCONNECTED (0x800401FD)オブジェクトをサーバに接続できません」ってことらしい。
とりあえず,GetActiveObjectで取ってあげると,それなりに動くんだけど,終了時に落ちたりしてなんか違う。

けど,google君に聞いてもよくわからない……

なんだかんだで,どうやら,差分検出時のスレッドと詳細表示時のスレッドが異なっているらしい。
よくわからんけど,ま,そのあたりが原因でしょうということで,調べるのが面倒なんで……
解析用の専用スレッドを立ち上げて,そのスレッドで変換するようにしてお終い。

#って,実装は結構厄介で面倒だったんだけど,調べるより速いかと……
#な,感じなんで,イマイチ正しくないかも……

|

« 十津川警部…… | トップページ | WinMerge用プラグイン公開その2 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/3881/2393376

この記事へのトラックバック一覧です: WordのCOMではまる。:

« 十津川警部…… | トップページ | WinMerge用プラグイン公開その2 »