Windows2000の頃、Word/Excelの複数ファイルを選択して
右クリックして開いたり、印刷すると抜けが生じました。
またファイル数に応じて抜け殻のアプリが残りました。
WindowsXPでもShellExecute()やInvokeVerb()で続けて開くと駄目。
印刷をDDEで非同期に行っていることによる多重処理の設計障害です。
DDEの処理論理は、疑似コードで書くと、以下のようなものです。
if exists then
[open]
[print]
[close]
else
start
[open]
[print]
[close]
[stop]
※2
endif
この処理論理はシングルプロセスではOKです。しかし多重処理ではNGです。
多数(n)のインスタンスが生成されます。
start
start
…
多数(n)のDDE要求はひとつのインスタンスにキューイングされます。
[open]
[print]
[close]
[stop] <---※1
[open]
[print]
[close]
[stop]
…
1つの処理をやってn-1の処理をキューに残したまま終了してしまいます。
n-1のゾンビが残ります。
正しくは、処理論理の全体をロックでシリアライズする必要があります。
回避方法は、先にWord/Excelアプリをひとつ立ち上げておくことです。
Windows XPやWord/Excel 2002は、取敢えず修正したようです。
Windows XPのシェルは、複数ファイルを逐次処理するように変えたようです。
Word 2002は複数のDDE要求を受け付けない/xオプションを作ったようです。
しかし、所詮弥縫策なのでは?
この修正が、なぜ駄目修正なのか?
シェルで複数選択したときだけにしか効かない。
スクリプトからShellExecute()やInvokeVerb()で続けて起動すると駄目。
複数ファイルをプリンタのドラッグ&ドロップしたときはまた別で駄目。
一応確認メッセージを出して、それで済まそうとしているようで姑息。