CreateProcess内でShellExecuteは可能?

[戻る]
りょうた 2002/04/23(火) 15:28:04
はじめまして!
CreateProcessで起動されたEXE内でShellExecuteを使用しIEを起動したいのですが、
起動しようとすると、EXEがフリーズ?します。
どうやらCreateProcessの呼び出し元の方でShellExecuteされているみたいなのです。
プログラムは以下です。
-------------------------------------------------------
if(CreateProcess( NULL, pApl, NULL, NULL, FALSE, 0, NULL, buf, &si, &pi))
{
 //スレッドハンドルは使わないので即座に開放
 CloseHandle(pi.hThread);

 //起動したプロセスの終了を待つ
 WaitForSingleObject( pi.hProcess, INFINITE );

 //プロセスハンドルを開放
 CloseHandle(pi.hProcess);
}
-------------------------------------------------------
WaitForSingleObjectのせいかと思い、WaitForInputIdleに変更してみると
意図どおりに動きました。
ですが、これではEXEが起動しっぱなしになってしまいます。(終了を受け取りたい)

CreateProcess内でShellExecuteは可能なのでしょうか?
よろしくお願いします。

りょうた 2002/04/23(火) 15:28:54
>どうやらCreateProcessの呼び出し元の方でShellExecute

すいませんこれは未確認です。

さなえ 2002/04/23(火) 16:11:08
ハンドルを閉じないでおけばGetExitCodeProcessで利用できると思います。

りょうた 2002/04/23(火) 18:15:58
さなえさんありがとうございます。

ご指摘のとおりGetExitCodeProcessで終了を捕まえることができました。
しかしこれだとWaitForSingleObjectと同じように
ブラウザが起動しませんでした。

イメージとしてはキックするEXEを呼び出し元に対してモーダルで起動
という風にしたいのですが。。。

さなえ 2002/04/23(火) 18:23:24
モーダルといわれると悩んじゃいますが
私は横着者なので待たない時はWait・・・は何も呼びません。
CloseHandle(pi.hThread); だけで済ましてます。

 

りょうた 2002/04/23(火) 18:28:04
どうやらプロセスのハンドルをとじないと
ブラウザは起動しないみたいです。

EXE起動中は呼び出し元を触れないようにモーダルで起動したいんですが、
強引にSetWindowPosでダイアログを消したり
操作を無効にしたりするしかないんですかね。

不良PG [E-Mail] 2002/04/23(火) 18:31:10
とりあえず、作っているのは、どちら?それとも両方?
・CreateProcessで起動するソフト
・ShellExecuteを使用しIEを起動するソフト

りょうた 2002/04/23(火) 19:19:01
>とりあえず、作っているのは、どちら?それとも両方?

両方なんで、好きなように作れます。

不良PG [E-Mail] 2002/04/23(火) 19:27:27
前提を覆しますが・・
IEをCreateProcessで起動というのはどうですか?
ShellExecuteにこだわるなら駄目ですが・・
この辺りを使って・・
::FindExecutable

りょうた 2002/04/24(水) 14:35:13
不良PGさんありがとうございます。

そうですね。なにもShellExecuteにこだわることもないですね。
というわけで、CreateProcessでIEを起動してみると。。。
できました!意図通りに起動しました!

今から実装します。
できましたらまた報告させて頂きます。

りょうた 2002/04/24(水) 16:03:07
[[解決]]
実装できました!

ブラウザのパスを取るのに不良PGさんがおっしゃってた
FindExecutableを使おうと思ったんですが、
色々調べてみるとバグがあるとのこと(しかも環境依存)
参考:http://www.geocities.co.jp/Playtown-Spade/4058/code/memo/memo4.html

一応FindExecutableでも取得できることは確認したのですが、
怖いのでレジストリから取得しました。
HKEY_CLASSES_ROOT\.html
HKEY_CLASSES_ROOT\htmlfile\shell\open\command

ブラウザの起動は以下です。
------------------------------------------------
char buf[256];
GetCurrentDirectory(MAX_PATH, buf);
strURL.Format("\"%s\" %s\\help\\%main.html", strDefBrowser, buf);

LPTSTR  pApl;
pApl = (LPTSTR&)strURL;

STARTUPINFO  si;
PROCESS_INFORMATION  pi;

ZeroMemory( &si, sizeof( STARTUPINFO ));
si.cb          = sizeof( STARTUPINFO );
si.dwFlags     = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
if(CreateProcess( NULL, pApl, // コマンドライン文字列
                  NULL, NULL, FALSE, 0, NULL, buf, &si, &pi))
{
 //ハンドルを開放
 CloseHandle(pi.hThread);
 CloseHandle(pi.hProcess);
}
------------------------------------------------
みなさん長々とありがとうございました。

古いスレッドには追加発言できません。