C言語関係掲示板

過去ログ

No.165.Cの中からBAT,SH,EXE等を呼出して実行する方法


No.1069

Cの中からBAT,SH,EXE等を呼出して実行する方法
投稿者---ミニモニ(2002/02/19 22:04:44)


Cのプログラムから他のEXEやBATスクリプト・シェルスクリプトを呼出して実行させる
方法を探しています。

下記がイメージですが・・・

menu.c)
#include<stdio.h>
int main(void)
{
int select;
printf("################################");
printf("# #");
printf("# THE MENU!! #");
printf("# #");
printf("# ---------------------------- #");
printf("# 1.BAT #");
printf("# 2.SH #");
printf("# 4.EXE #");
printf("# *.EXIT #");
printf("# #");
printf("################################");
printf("選択してください :");
scanf("%d",select);
switch(select){
case '1':
call C:\test\aaa.bat;
break;

case '2':
call C:\test\bbb.sh;
break;

case '3':
call C:\test\ccc.exe;
break;

case '4':
exit;
break;}
}

上記のようなメニューがあったとして

aaa.bat)
echo off
dir C:\ >aaa.txt

bbb.sh)
#!/bin/sh
ls -l / >bbb.txt

ccc.exe)
priveto sub command1_click()
form2.show
end sub

このような感じです
宜しくお願いします

No.1071

Re:Cの中からBAT,SH,EXE等を呼出して実行する方法
投稿者---ともじ(2002/02/19 23:21:16)


こんばんは。

>Cのプログラムから他のEXEやBATスクリプト・シェルスクリプトを呼出して実行させる
>方法を探しています。

プログラム中からコマンドを実行するにはsystem関数を使います。

それから、ご提示のプログラムですが、

>scanf("%d",select);
とありますが、

>switch(select){
> case '1':

としていますので、
select = getchar(); がいいのではないでしょうか。
scanfを使う場合は scanf("%c",&select); とすべきですが、
selectをintで宣言した場合、あらかじめ0でクリアしておかないと
不定値が残る場合があります。


No.1072

Re:Cの中からBAT,SH,EXE等を呼出して実行する方法
投稿者---fen(2002/02/20 04:28:04)


spawn系関数(process.h)を使う方法もあります
spawn系関数の第一引数はintで以下のどれかになります
 _P_WAIT プロセスが終了するまで待つ
 _P_NOWAIT プロセス終了を待たない
 _P_OVERLAY 呼び出し元のプロセスを終了させ、呼び出し先に引き継がせる
 _P_DETACH バックグラウンドで並列に実行する

その後の引数は関数によって異なります
spawnには大まかに分けspawnlとspanwvがあります

spawnl(int, const char* cmd, const char* arg, ...)
渡すコマンドの数がわかっている場合に使います
第二引数は実行するファイル名
第三引数からはコマンド引数となります
最初のコマンド引数は出来る限り第二引数と同じにするのが望ましいです
コマンド引数の最後は必ずNULLで終わらせて下さい
例:a.exeを [a.exe test]という様に実行する
spawnl(_P_WAIT, "a.exe", "a.exe", "test", NULL);

spawnv(int, const char*, const char*[])
spawnlと違い、引数の数が不定の時に使います
第三引数にはコマンド引数をさすポインタの配列のアドレスを渡します
このコマンド引数も必ず最後はNULLを与えてください
例:a.exeを[a.exe test]という様に実行する
char *cmdarg[] = {"a.txt", "test", NULL};
spawnv[_P_WAIT, "a.txt", cmdarg);

あと、spawn関数にはspawnl spawnv両方ともに、e pの付くものがあります
各々以下の関数名になります
spawnle spawnlp spawnlpe
spawnve spanwvp spanwvpe

e付属の関数は引数の最後に環境変数へのアドレスを渡します
以下の様に使います(mainの第三引数による環境変数取得は非標準です)
int main(int argc, char* argv[], char* env[]) {
spawnve(_P_WAIT, argv[2], &argv[2], env);
}

p付属は実行ファイルの検索に環境変数のPATHを使用します
それ以外の関数呼び出し方法はpがついていない場合と変わりありません

spawnで注意しなければならないのは、bat com exe等しか実行出来ないと言う事です
シェルが扱うようなコマンド(Windows-DOS窓で例えると、dirやtype等)は実行できません
その場合は素直にsystem(char*)を使います
system("dir c:\\");


No.1073

いいわすれ
投稿者---fen(2002/02/20 04:38:05)


spawnの実装は処理系によってサポートの度合が変わってきます
_P_DETACHは出来る限り使わないほうが良いでしょう

あと、環境変数ですが、eの付く関数以外は全て呼び出し元の環境変数を引き継ぎます
環境変数を変える必要があるときだけ、eの付く関数を使用してください

もう不備はないと思いますが……どうでしょう?

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.03.16
Copyright(c) 2000-2002 TOMOJI All Rights Reserved