プロが教える店舗&オフィスのセキュリティ対策術

今回exeから別exe(or bat)を起動させる処理を作成しようとしているのですが、
呼び出した後(今回であればnotepad.exe)5秒程度砂時計マークがでる状態になるのです。(バッチでも同じ)
なにか原因があるのでしょうか。また、対処方があれば教えてください。

【前提】
・本体exeにウィンドウは必要なし
・バッチの場合はcmd.exeは非表示

【環境】
・XP SP2 でコンパイル。 bcc32 5.5.1 と VB6
・実行はXP SP2 とWin2000 双方で同様の結果

【ソース】
#include<windows.h>

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,int nCmdShow ) {

PROCESS_INFORMATION pi;
STARTUPINFO si;

ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);

CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS,
NULL,NULL,&si,&pi);


CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
return 0;
}

A 回答 (3件)

WaitForSingleObject(pi.hProcess,INFINITE);


とすると、ウィンドウを持ったプロセスの場合、起動したプロセスが終了するまで砂時計が表示されます。
今回のウィンドウなしでも砂時計が出る原因はちょっとわかりません。
VC20005では砂時計はでませんでしたので、コンパイル環境の問題かもしれませんね。

こうしてみてはどうでしょう?
while(WaitForSingleObject(pi.hProcess,0) == WAIT_TIMEOUT){
Sleep(100); // 適当な時間待たせます。
};

参考までに、GetExitCodeProcess(pi.hProcess,&exitCode); とすれば、起動したプロセスの終了コードを取得できます。
    • good
    • 0
この回答へのお礼

遅くなりましたがVC2003コンパイラにてコンパイルすると若干早くなりました。同じコードなのに・・・

今回は実験なのでこのままにしました^_^;

ありがとうございました。

お礼日時:2006/12/25 19:06

>しかし呼び出し側のexe(ソース添付プログラム)が待ち状態になっているような感じです。



ああ、その問題ですか。
まんま、スレッド立ち上げてそっちから通知もらうようにしないと、本体プログラム待ちますよ。

参考URLをどうぞ。

参考URL:http://www.sm.rim.or.jp/~shishido/cprocess.html
    • good
    • 0

プログラム的な事ではないのですが、コマンドラインや、ショートカットでも同じくらい時間掛かるのであれば、ファイルシステムのデフラグ等ですかね?


パス等が沢山指定されていて、フルパス書いてないとき等も、exeファイルを探すのに時間掛かったりします。

この回答への補足

回答ありがとうございます。

補足しますと今回のプログラムでは[notepad.exe]自体は開けます。
しかし呼び出し側のexe(ソース添付プログラム)が待ち状態になっているような感じです。

本ソースにはWindow表示をしていませんが、試しに行った場合、起動後枠が表示されnotepad.exe起動します。その後5秒後辺りに白く表示エリア?が表示されます。

WaitForSingleObject(pi.hProcess,INFINITE);
の使い方の問題かな?と推測しているのですが、マニュアルおよびネットのサンプルを見ても今ひとつ回答に繋がりません。

ご存知の方がいれば些細なことでも結構です。よろしくお願いします。
不足している情報があれば追加します。

補足日時:2006/11/24 12:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!