Officeアプリケーションのプロセスがなかなか消えない

また新カテゴリーを増やしてしまった…。

お客様に納入したOffice IACを利用したアプリケーションで、Word2010を終了後にひたすらプロセスが残り続けるトラブルがありました。

初めはウイルス対策ソフトを疑い、次にHyper-Vを疑い、サービスを疑い、セキュリティパッチを疑い…と何日もかけて調査して、やっと原因を探し当てたのですが、この原因がなんとRTFファイルでした。

RTFファイルの処理自体に、何の問題があるわけでもありません。
問題はOfficeアプリケーションの周辺機能、ファイル履歴にあったのです。

「最近使ったファイル」で使用される、文書へのショートカットは、ユーザーアプリケーションデータ領域のMicrosoft\Office\Recentフォルダに作成されます。
WordやExcelなどに表示される「最近使ったファイル」のリストはこちらをさらにアプリケーションごとに分けて参照しているのが実態です。

で、このフォルダに格納されたショートカットは、Office文書、非Office文書、フォルダの3種類に分類されて、index.datに記録されます。
ここでいうOffice文書とは、あらかじめ登録された拡張子をもつファイルを指します。
各アプリケーションはOffice文書を閉じるタイミングで、index.datを参照して、ショートカットの整理を行います。非Office文書もOffice文書も、フォルダも、整理されるのはアプリケーションが「Office文書を」閉じるタイミングです。
ここ、重要です。

Office文書のショートカットの保存上限は20個に設定されているので、docファイルを連続で何個開いても、ショートカットは20個しかできません。
ところが、RTFファイルを連続で開くと、ショートカットが無限に作成されてしまいます。

はい、そうです。
Officeの取り扱う文書の拡張子として、RTFは登録されていない…つまり、非Office文書なのです。

先ほど、ショートカットが整理されるのはアプリケーションが「Office文書を」閉じるタイミングだと書きました。
RTFを5,6個連続で開いたところで、その後でdocを開けば、RTFファイルのショートカットも同時に整理されるのですが、逆に言えば、RTFを開き続けている限り、残り続けるわけです。

では、これが200ファイルも続くとどうなるか。
実は、ショートカットは200個までで収まるようです。トータルのショートカット数も規定されているからです。

ここでよかったと思ったアナタ、大間違いです。
実は、ショートカットは消えていますが、index.datに書かれたエントリは消えていないのです。

index.datの中身をテキストエディタで見ると、
[doc]
xxxx.doc.lnk=0
xxx2.doc.lnk=0
[xls]
xxxxx.xls.lnk=0
xxxx2.xls.lnk=0

といったように、Office文書は拡張子ごとに整理されています。

しかし、非Office文書は
[misc********]
xxxx.rtf.lnk=0
[misc********]
xxxx2.rtf.lnk=0
[misc********]
xxxx3.rtf.lnk=0

といったように、すべての文書が異なるファイルタイプとして保存されています。
これを削除しようとしないので、index.datはどんどん肥大化していきます。

index.datが肥大化するとどうなるか。
Officeアプリケーションが終了時に実行する、ショートカット整理のための解析の時間が余計にかかります。
手動でOfficeアプリケーションを閉じた際にはすぐプロセスが消えますが、IACやマクロを使って終わらせた際には、プロセスが15分以上も残っていたりします。
しかも厄介なことに、ホスト側のプログラムはプロセス終了を同期的に待機したりしません。プロセスが残っている間に違うOfficeアプリケーションのインスタンスを作成して、同じリソースにアクセスしようとしたりすると、深刻なアクセス違反を引き起こしたり、動作遅延を起こしたりします。

このような状況は、レジストリを操作することで防止することができます。
一つは、拡張子rtfをOffice文書として認識させる。
さらに、そもそも履歴ショートカットが作成されないようにする。
以下の情報を組み合わせれば、まあ何とかなります。

Office アプリケーションで最近使ったファイルのショートカットを作成させない
http://hebikuzure.wordpress.com/2009/03/22/office-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E6%9C%80%E8%BF%91%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%B7%E3%83%A7/

MSOfficeレジストリ一覧(Excel)
http://www-pc.uni-regensburg.de/systemsw/office/O2K/regkey.xls