†Sibylのお部屋†

【Sibyl】外部プログラムの実行:Exec

作成開始日 2022.01.11
最終更新日 2022.01.12

DOS unitのEXEC関数を使う。20年前はガンガン使っていたのだが、今回いざ使おうと思ったら、情報が仲々見つからなくて実に困った。関数名が一般的すぎて検索しにくいし、そもそも情報がどこにあるのかが判らなかった(SPCCじゃなくてSibyl標準ユニット)。
構文:EXEC(コマンド,引数);

用例:@EXEC('C:\OS2\E.EXE','D:\MYDATA.TXT');
   AEXEC('C:\OS2\CMD.EXE','/K DIR');

戻値:id:LongWord(rc:=DosExitCode(id)形式で使用する筈だがフリーズする(u_u;))
  :DosError:整数型(WordなのかLongWordなのかULongなのか型が判らん)
   こちらは正常取得可能だが、果たして意味があるのか判らん…
最初の例@では、システム・エディター(E.EXE)を起動して、D:\MYDATA.TXTというテキストファイルを読み込んでいる。PMプログラムはこの形式が標準。

2番目の例Aではコマンドインタープリタ(CMD.EXE)を起動して、DIRコマンドを実行している。コマンドラインで起動するプログラム(UNZIP等)はこちらの形式を使用する。なお、「/K」「/C」オプションに関しては、OS/2コマンドリファレンス参照。

【注意】外部プログラムを実行すると、それを呼び出したオブジェクトにはOnExitイベントが、また外部プログラムから戻るときにはOnEnterイベントが発生する。これらのイベントハンドラは意識せずに実行されてしまうため、バグの発生時には原因究明に苦労する。

このほか、EXECでSTARTコマンドを指定するとか、プログラムの起動方法にはいろいろあって、ウィンドウがアクティブで起動するのか、バックグラウンド起動なのか、あるいはモーダル(コマンド実行中に本体側の機能を停止するか否か)とか、けっこう厄介な問題が多いが、何をどうすればどうなるのか全部忘れた。ただ、前面/後面問題は結局解決できなかったような記憶がある。

このあたり、グローバル変数で制御できる部分もあるようだ。

ExecViaSession 外部プログラムを表示するか否か True/False
AsynchExec たぶん、並行動作の許可だと思うが True/False

【付記】基本的なファイル操作

ファイルのコピー/削除/リネームなどは、EXECでCMDを呼び出して実行しても良いのだが、SysUtilsのCopyFile/DeleteFile/RenameFileでも行える。ただ、これにも弊害があって…どんな弊害かは忘れたが、結局EXECで自作のREXXスクリプトを起動していたな。


【Sibylのお部屋目次】 【ホーム】