ウィンドウハンドルからCWndの取得について – プログラミング – Home

ウィンドウハンドルからCWndの取得に...
 
通知
すべてクリア

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


モネ
 モネ
(@モネ)
ゲスト
結合: 19年前
投稿: 4
Topic starter  

お世話になります。モネと申します。

現在、別プロセス間で同一の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が見つけられない状態に
なっているような気がします。

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


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> FromHandleではAP-1側で扱っているCWndのポインタは取得できず、
> 一時的なポインタが割り振られるようです。

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


返信引用
モネ
 モネ
(@モネ)
ゲスト
結合: 19年前
投稿: 4
Topic starter  

シャノン様、ご返答ありがとうございます。

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

1. アサートはどこで失敗してますか?
2. リソース解放処理とやらが怪しいとお思いならば、そのコードを掲載してください。


返信引用
モネ
 モネ
(@モネ)
ゲスト
結合: 19年前
投稿: 4
Topic starter  

シャノン様、ご返答ありがとうございます。

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

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

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

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

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

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


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

ダイアログの管理と、AP-2 の管理とがごっちゃになっていてよくわかりません。
もう一度、きちんと整理することをお薦めします。

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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