CreateProcess内でShellExecuteは可能? – プログラミング – Home

通知
すべてクリア

[解決済] CreateProcess内でShellExecuteは可能?


りょうた
 りょうた
(@りょうた)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

はじめまして!
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は可能なのでしょうか?
よろしくお願いします。


引用未解決
トピックタグ
りょうた
 りょうた
(@りょうた)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

>どうやらCreateProcessの呼び出し元の方でShellExecute

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


返信引用
さなえ
 さなえ
(@さなえ)
ゲスト
結合: 23年前
投稿: 24
 

ハンドルを閉じないでおけばGetExitCodeProcessで利用できると思います。


返信引用
りょうた
 りょうた
(@りょうた)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

さなえさんありがとうございます。

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

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


返信引用
さなえ
 さなえ
(@さなえ)
ゲスト
結合: 23年前
投稿: 24
 

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

 


返信引用
りょうた
 りょうた
(@りょうた)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

どうやらプロセスのハンドルをとじないと
ブラウザは起動しないみたいです。

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 80
 

とりあえず、作っているのは、どちら?それとも両方?
・CreateProcessで起動するソフト
・ShellExecuteを使用しIEを起動するソフト


返信引用
りょうた
 りょうた
(@りょうた)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

>とりあえず、作っているのは、どちら?それとも両方?

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 80
 

前提を覆しますが・・
IEをCreateProcessで起動というのはどうですか?
ShellExecuteにこだわるなら駄目ですが・・
この辺りを使って・・
::FindExecutable


返信引用
りょうた
 りょうた
(@りょうた)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

不良PGさんありがとうございます。

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

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


返信引用
りょうた
 りょうた
(@りょうた)
ゲスト
結合: 23年前
投稿: 7
Topic starter  

実装できました!

ブラウザのパスを取るのに不良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);
}
------------------------------------------------
みなさん長々とありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました