« 非表示で残ってしまったExcel/Wordなどを表示する。 | トップページ | エラー時の資源解放 »

2007年1月19日 (金)

DDEは多重処理に耐えません。

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()で続けて起動すると駄目。

複数ファイルをプリンタのドラッグ&ドロップしたときはまた別で駄目。
一応確認メッセージを出して、それで済まそうとしているようで姑息。

« 非表示で残ってしまったExcel/Wordなどを表示する。 | トップページ | エラー時の資源解放 »