C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: MFC、exe間のモーダル表示


(過去ログ 54 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■30293 / inTopicNo.1)  MFC、exe間のモーダル表示
  
□投稿者/ ぶどう (5回)-(2008/12/20(Sat) 14:04:04)

分類:[C/C++] 

お世話になっております、ぶどうと申します。

使用環境:VC6++、MFC
言語:C++

質問:exe間のモーダル起動について

内容
@:上記の使用環境で作ったA.exeとB.exeが有ります。
A:A.exe上のボタンを押す事によって、B.exeが起動します。
B:この時、AとBとの関係をメッセージボックスのように、
  モーダル表示にしたい。

この時、A.exe上の起動ボタン内で下記のようなソースを組んで見ましたが、
実際はA.exeをハングアップ状態にしているだけでして、
何クリックかすると“応答無し”状態になってしまいます。

この“応答無し”を回避する方法は有りますでしょうか。
お手数ですが、宜しくお願いします。

CreateProcess(NULL,
		"B.exe",
		NULL ,
		NULL ,
		FALSE,                
		CREATE_NEW_PROCESS_GROUP,
		NULL ,
		NULL ,
		&si ,
		&pi);


while( 1 ){
	ShowWindow(SW_SHOWNORMAL);
	UpdateWindow();
	if( WAIT_OBJECT_0 == WaitForSingleObject( pi.hProcess, INFINITE ) ){
		break;
	}
}

引用返信 編集キー/
■30294 / inTopicNo.2)  Re[1]: MFC、exe間のモーダル表示
□投稿者/ .SHO (493回)-(2008/12/20(Sat) 14:16:09)
No30293 (ぶどう さん) に返信

> while( 1 ){
> 	ShowWindow(SW_SHOWNORMAL);
> 	UpdateWindow();
> 	if( WAIT_OBJECT_0 == WaitForSingleObject( pi.hProcess, INFINITE ) ){
> 		break;
> 	}
> }

ここを

ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
while( WAIT_OBJECT_0 != WaitForSingleObject( pi.hProcess, INFINITE ) ){
    GetMessage( &msg, NULL, 0, 0 ) ) {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}

かな?
(未確認です)

引用返信 編集キー/
■30295 / inTopicNo.3)  Re[2]: MFC、exe間のモーダル表示
□投稿者/ Azulean (245回)-(2008/12/20(Sat) 15:31:49)
2008/12/20(Sat) 15:32:49 編集(投稿者)

目的に対してなぜ、while(1)でShowWindow/UpdateWindowのループをしているのかよく分かりません。
また、WaitForSingleObjectにINFINITEで渡しちゃうと、そのプロセスが終了するまでずっと帰ってこないので目的を満たせません。

応答なしを防ぐには、メッセージループを回すしかないです。
メッセージループを回すと、A.EXE側で色々と操作できてしまうため、プロセスを起動する時にウィンドウをEnableWindowか何かで無効状態にして、プロセスの終了と共に有効状態に戻す処理を入れる必要があります。


また、A.EXEのウィンドウをオーナーウィンドウとして、B.EXEでモーダル表示というのもなくはないですが、ややこしいことになりますし、一般的かどうかよく分かりません。
引用返信 編集キー/
■30296 / inTopicNo.4)  Re[3]: MFC、exe間のモーダル表示
□投稿者/ .SHO (494回)-(2008/12/20(Sat) 15:50:09)
2008/12/20(Sat) 15:51:28 編集(投稿者)
> また、WaitForSingleObjectにINFINITEで渡しちゃうと
>そのプロセスが終了するまでずっと帰ってこないので目的を満たせません。

確かに。

じゃぁ

ShowWindow(SW_SHOWNORMAL);
UpdateWindow();

EnableWindow( hWnd, FALSE );
while( WAIT_OBJECT_0 != WaitForSingleObject( pi.hProcess, 0 ) ){
    GetMessage( &msg, NULL, 0, 0 ) ) {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}
EnableWindow( hWnd, TRUE );

かな?
(またも未確認)

引用返信 編集キー/
■30297 / inTopicNo.5)  Re[4]: MFC、exe間のモーダル表示
□投稿者/ .SHO (495回)-(2008/12/20(Sat) 16:00:06)
たぶん

ShowWindow(SW_SHOWNORMAL);
UpdateWindow();

は、いらないですよね?
引用返信 編集キー/
■30309 / inTopicNo.6)  Re[5]: MFC、exe間のモーダル表示
□投稿者/ ぶどう (6回)-(2008/12/20(Sat) 21:27:13)
Azuleanさん。.SHOさん。
アドバイスありがとうございます。
返信遅れてすみません。

アドバイスを受けまして、調べなおしました結果、
以下のようなソースにする事によって、応答無しを回避しました。

while(GetMessage( &msg, NULL, 0, 0 ))
{
	TranslateMessage( &msg );
	DispatchMessage( &msg );
	if( WAIT_OBJECT_0 == WaitForSingleObject( pi.hProcess, 0 ))
	{

		break;
	}
}
SetActiveWindow(); 
EnableWindow(TRUE);

現在、この条件文では、タイムアウトが関係して上手くSetActiveWindowsを動かせないので、
他の方法が無いか模索しています。

引用返信 編集キー/
■30347 / inTopicNo.7)  Re[6]: MFC、exe間のモーダル表示
□投稿者/ .SHO (499回)-(2008/12/22(Mon) 10:26:19)
No30309 (ぶどう さん) に返信

> 現在、この条件文では、タイムアウトが関係して上手くSetActiveWindowsを動かせないので、

どういうこと?
引用返信 編集キー/
■30355 / inTopicNo.8)  Re[7]: MFC、exe間のモーダル表示
□投稿者/ .SHO (501回)-(2008/12/22(Mon) 11:47:23)
わかった。
それじゃぁ、メッセージが発生しない限りGetMessageから戻らないので結局意味ないです。
PeekMessage使ってください。

引用返信 編集キー/
■30501 / inTopicNo.9)  Re[8]: MFC、exe間のモーダル表示
□投稿者/ とっちゃん@おうち (3回)-(2008/12/25(Thu) 10:24:41)
とっちゃん@おうち さんの Web サイト
No30355 (.SHO さん) に返信

プロセスの終了待ちをするのなら MsgWaitForMultipleObjects を使う方が効率が上がりますよ。
リファレンス読めばわかりますが、GetMessageとWaitforMulipleObjects 同時に行えるAPIです。
#もちろん1個からハンドル待ちできます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -