二重起動時にCMainFrameオブジェクトを使用するには – プログラミング – Home

二重起動時にCMainFrameオブジ...
 
通知
すべてクリア

[解決済] 二重起動時にCMainFrameオブジェクトを使用するには


Aquarium
 Aquarium
(@Aquarium)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

お世話になっております。
WindowsXP ProでVC6 SP6 MFC(exe/MDI)を
使用しています。

いま、ミューテックスを使用してアプリケーションの
二重起動防止をしています。

アプリケーションが二重起動された場合に、
最初に起動された方のアプリケーションの
メインウィンドウのハンドルを取得し、
そのウィンドウハンドルを使用して
ウィンドウを前面に出すなどの処理を行っています。

ですが、そのウィンドウハンドルから
アプリケーションのCMainFrameクラスの
オブジェクトを作成しようとするとうまくいきません。
(クラスのメンバなどが参照できません)

デバッグしたところ、どうやらそのウィンドウハンドルで
作成されるオブジェクトは、MFCの非公開クラスの
CTempWndクラスのオブジェクトになってしまうようです。

ちなみに最初に起動されたほうのアプリケーションの
ウィンドウハンドルはSetProp()/GetProp()を使用する方法と、
プロセスからウィンドウハンドルを取得する方法の
二通りで試してみましたが結果はともに同じで、
上記のようになってしまいました。

二重起動された場合に、最初に起動された方の
アプリケーションのCMainFrameクラスのメンバを
使用したい場合はどうすればよいのでしょうか。

ご存知の方、どうぞご教授ください。
よろしくお願い致します。


引用未解決
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> ですが、そのウィンドウハンドルから
> アプリケーションのCMainFrameクラスの
> オブジェクトを作成しようとするとうまくいきません。
> (クラスのメンバなどが参照できません)

OSはそのウィンドウと関連付けられているのが、
CMainFrameクラスだということを知りませんので無理なのでしょう。

後からの起動をきっかけに、元のプロセスに何かさせたいのならば、
取得したウィンドウハンドルに、ユーザー定義のウィンドウメッセージを
送れば良いと思いますが。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

基本的にプロセス跨りになると思うので無理でしょうね。
ウインドウハンドルからクラスを起こしても元のインスタンスとは
別物になるでしょうし。ウインドウハンドルから起こしたインスタンスで
使えるのは独自派生した部分に含まれない部分だけだと思います。

この場合、たいちうさんが書かれているように実際の処理は
そのメンバーの持ち主である元のプロセスの中で行なうべきですので
ユーザー定義のウインドウメッセージを使って処理を依頼するのが
一般的な方法だと思います。
また、どうしても元のウインドウ側の情報が必要なのであれば、
元のプロセスとの間で共有メモリ等を利用したデータのやり取りの
仕組みをきちんと設計するべきでしょう。


返信引用
Aquarium
 Aquarium
(@Aquarium)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

たいちうさま、PATIOさま
回答ありがとうございます。

なるほど、後から起動された側で
最初に起動されたほうの操作をしようと
思ったのが今回の現象を招いてしまったようですね。

今回はご指摘にあるとおり、ユーザ定義のメッセージを用意し、
それをウィンドウに送ることにより対応したいと思います。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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