お世話になっております。
WindowsXP ProでVC6 SP6 MFC(exe/MDI)を
使用しています。
いま、ミューテックスを使用してアプリケーションの
二重起動防止をしています。
アプリケーションが二重起動された場合に、
最初に起動された方のアプリケーションの
メインウィンドウのハンドルを取得し、
そのウィンドウハンドルを使用して
ウィンドウを前面に出すなどの処理を行っています。
ですが、そのウィンドウハンドルから
アプリケーションのCMainFrameクラスの
オブジェクトを作成しようとするとうまくいきません。
(クラスのメンバなどが参照できません)
デバッグしたところ、どうやらそのウィンドウハンドルで
作成されるオブジェクトは、MFCの非公開クラスの
CTempWndクラスのオブジェクトになってしまうようです。
ちなみに最初に起動されたほうのアプリケーションの
ウィンドウハンドルはSetProp()/GetProp()を使用する方法と、
プロセスからウィンドウハンドルを取得する方法の
二通りで試してみましたが結果はともに同じで、
上記のようになってしまいました。
二重起動された場合に、最初に起動された方の
アプリケーションのCMainFrameクラスのメンバを
使用したい場合はどうすればよいのでしょうか。
ご存知の方、どうぞご教授ください。
よろしくお願い致します。
> ですが、そのウィンドウハンドルから
> アプリケーションのCMainFrameクラスの
> オブジェクトを作成しようとするとうまくいきません。
> (クラスのメンバなどが参照できません)
OSはそのウィンドウと関連付けられているのが、
CMainFrameクラスだということを知りませんので無理なのでしょう。
後からの起動をきっかけに、元のプロセスに何かさせたいのならば、
取得したウィンドウハンドルに、ユーザー定義のウィンドウメッセージを
送れば良いと思いますが。
基本的にプロセス跨りになると思うので無理でしょうね。
ウインドウハンドルからクラスを起こしても元のインスタンスとは
別物になるでしょうし。ウインドウハンドルから起こしたインスタンスで
使えるのは独自派生した部分に含まれない部分だけだと思います。
この場合、たいちうさんが書かれているように実際の処理は
そのメンバーの持ち主である元のプロセスの中で行なうべきですので
ユーザー定義のウインドウメッセージを使って処理を依頼するのが
一般的な方法だと思います。
また、どうしても元のウインドウ側の情報が必要なのであれば、
元のプロセスとの間で共有メモリ等を利用したデータのやり取りの
仕組みをきちんと設計するべきでしょう。
たいちうさま、PATIOさま
回答ありがとうございます。
なるほど、後から起動された側で
最初に起動されたほうの操作をしようと
思ったのが今回の現象を招いてしまったようですね。
今回はご指摘にあるとおり、ユーザ定義のメッセージを用意し、
それをウィンドウに送ることにより対応したいと思います。
ありがとうございました。