Windows

41. CALLコマンドが使えるのは IBM iだけ

私たちはCALLコマンドで毎日、プログラムの呼び出しを行っているが
CALLコマンドによるプログラムの呼び出しができるのは
IBM i だけである。
そんな馬鹿な…WindowsでもCALLコマンドに相当する命令が
あって使われているに違いないと思われるだろうが
事実ない
(これはMicrosoft の HELP Deskにも確認したことがある)

CALLコマンドの動作を考えてみよう。
CALLコマンドとは

①別のプログラムを同じジョブ内に呼び出して実行して

②その子プログラムの終了を待機する

という動作を行う。
ところがWindowsでは①の同じプロセス(=Windowsではジョブのことを
プロセスと呼ぶ)に別のプログラムを実行スタックに重ねて実行するという
ことができない。
Windowsができるのは別のプロセス(=IBM iのジョブ)に投入すること
だけである。
つまりIBM iで言うところのSBMJOB(=バッチ・ジョブへの投入)である。
正確にはIBM iのSBMJOBは対話式JOBへの投入ではないから
IBM iのSBMJOBとも異なる。
( IBM iで対話式JOBへの投入できるのはAutoWeb のCALLWEBコマンドだけである。
CALLWEBはブラウザの対話式JOBを起動することができる。)

Windowsには CALL命令に相当する機能はないので
CALLコマンドに近いことをやろうとすると

①CreateProcess API で別のプロセスとして投入する。

②WaitForSingleObject API でそのプロセスの終了を待機する。

という仕組みでの動作しかできない。
しかし終了を待機することはできるが結果の値を受取ることはできないので
別のメッセージのやり取りなどが必要になる。

IBM iでは誰もが日常的に使っているCALLコマンドがWindowsでは
いかに複雑であるかおわかり頂けただろうか?
よくIBM iを廃棄してWindowsプラット・フォームへ移行したいと
いう話を聞くがIBM i で普通にできていたことがWindowsでも
普通にできるのではない。

PCのキー・ボードでさえCOMPACに変えると必要なキーが無くなっていたりする。
同じ機能がWindowsも実現されているわけではない。
私達が IBM iの便利さに慣れきっているだけなのだ。
IBM iと同じことがWindowsなどでもできるとは簡単に思っては後で
苦労することになる。