はじめまして!
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は可能なのでしょうか?
よろしくお願いします。
>どうやらCreateProcessの呼び出し元の方でShellExecute
すいませんこれは未確認です。
ハンドルを閉じないでおけばGetExitCodeProcessで利用できると思います。
さなえさんありがとうございます。
ご指摘のとおりGetExitCodeProcessで終了を捕まえることができました。
しかしこれだとWaitForSingleObjectと同じように
ブラウザが起動しませんでした。
イメージとしてはキックするEXEを呼び出し元に対してモーダルで起動
という風にしたいのですが。。。
モーダルといわれると悩んじゃいますが
私は横着者なので待たない時はWait・・・は何も呼びません。
CloseHandle(pi.hThread); だけで済ましてます。
どうやらプロセスのハンドルをとじないと
ブラウザは起動しないみたいです。
EXE起動中は呼び出し元を触れないようにモーダルで起動したいんですが、
強引にSetWindowPosでダイアログを消したり
操作を無効にしたりするしかないんですかね。
とりあえず、作っているのは、どちら?それとも両方?
・CreateProcessで起動するソフト
・ShellExecuteを使用しIEを起動するソフト
>とりあえず、作っているのは、どちら?それとも両方?
両方なんで、好きなように作れます。
前提を覆しますが・・
IEをCreateProcessで起動というのはどうですか?
ShellExecuteにこだわるなら駄目ですが・・
この辺りを使って・・
::FindExecutable
不良PGさんありがとうございます。
そうですね。なにもShellExecuteにこだわることもないですね。
というわけで、CreateProcessでIEを起動してみると。。。
できました!意図通りに起動しました!
今から実装します。
できましたらまた報告させて頂きます。
実装できました!
ブラウザのパスを取るのに不良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);
}
------------------------------------------------
みなさん長々とありがとうございました。