ウィンドウハンドルからCWndの取得について

[戻る]
モネ 2007/07/13(金) 16:30:27
お世話になります。モネと申します。

現在、別プロセス間で同一のCWndが取得ができなくて困っております。

処理の流れとしてはAP-1からDLLをコールし、AP-2にダイアログの起動を依頼
しています。起動依頼はSendMessageにより、メッセージのコールバックの
処理を待ちます。
AP-2側のコールバック関数内でダイアログをCreateにて表示しておりますが、
モーダルダイアログとしたいため、起動時に呼び出し元AP(AP-1)をEnableWindow
にて固めています。
ダイアログ表示時にAP-1のCWndを指定し、AP-1の子ダイアログとしてAP-2を
起動したいのですが、CWndのポインタは別プロセス間では扱えないという事で
HWNDにてプロセス間通信をしています。

ウィンドウハンドルからCWndを取得したいのですが、FromHandlePermanentでは
NULLとなり、FromHandleではAP-1側で扱っているCWndのポインタは取得できず、
一時的なポインタが割り振られるようです。

AP-2側で新規にCWndをnewしてHWNDをAttachしたところ、コンパイルは通るのですが、
処理がAP-2→AP-1に戻ったときにアサートが表示される場合があります。

個人的な見解としては、AP-2側で新規にCWndをnewすればAP-1、AP-2の両方の
プロセスで同じHWNDを元に別々のCWndが構築されると思ったのですが、AP-2側で
リソース解放処理を行っているためにAP-1側でCWndが見つけられない状態に
なっているような気がします。

識者の方々で同様の現象をご存知でしたらご助言の程、よろしくお願いします。

シャノン 2007/07/13(金) 16:46:17
> FromHandleではAP-1側で扱っているCWndのポインタは取得できず、
> 一時的なポインタが割り振られるようです。

それで何が問題になるのでしょう?

モネ 2007/07/13(金) 17:06:33
シャノン様、ご返答ありがとうございます。

一時的なポインタの場合、確かにそのポインタを利用してダイアログの表示は
可能であり、モーダルダイアログ風にもできるのですが、AP-1側に戻ってきた
ときに、同じくアサートが表示される事があります。

AP-1側では、戻り値をMessageBoxにて表示しているのですが、アサートが表示
されない場合でも通常はMessageBoxはモーダルにて呼び出されるはずですが、
モーダルになっておらず、独立して(デスクトップウィンドウor他のウィンドウ
を親として)表示される場合があります。

アサートを無視すれば期待通りの動きはしているのですが、何かしら問題が
あるためにアサートが出ていると思われるので、回避策はありませんでしょうか。

シャノン 2007/07/13(金) 17:15:11
1. アサートはどこで失敗してますか?
2. リソース解放処理とやらが怪しいとお思いならば、そのコードを掲載してください。

モネ 2007/07/13(金) 17:21:50
シャノン様、ご返答ありがとうございます。

>1. アサートはどこで失敗してますか?

AP-1の戻り値確認用のMessageBox実行時で表示されます。

>2. リソース解放処理とやらが怪しいとお思いならば、そのコードを掲載してくださ
い。

AP-2からダイアログは複数表示されるため、ダイアログのインスタンス管理を
しております。ダイアログとともに親ウィンドウのポインタとして構造体を
用意し、ダイアログ起動時に格納しています。
その後、ダイアログ終了時にAP-2のメインフレームのコールバックを呼び出し、
そこで解放処理を行っています。
解放処理のソースは以下の通りです。

構造体変数.cwnd->Detach();
構造体変数.cwnd->DestroyWindow();
delete 構造体変数.cwnd;

以上です。よろしくお願い致します。

RAPT [HomePage] 2007/07/16(月) 16:04:04
ダイアログの管理と、AP-2 の管理とがごっちゃになっていてよくわかりません。
もう一度、きちんと整理することをお薦めします。

たとえば、
- ダイアログを表示指示があっても無視するとどうなるか
- ダイアログを複数表示の指示があっても1つしか処理しないとどうなるか

Ban 2007/07/16(月) 17:01:16
> 構造体変数.cwnd->Detach();
> 構造体変数.cwnd->DestroyWindow();

デタッチしてから破棄ですか?

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