二重起動防止とドキュメントオープン

[戻る]
hama 2002/03/09(土) 15:39:40
アプリケーション実行時に二重起動を防止しています。
ドキュメントファイルをダブルクリックされたときに、既にアプリ実行中の場合はその
ウィンドウにダブルクリックされたファイルをオープンしたいのですが、現在うまくい
きません。

以下の問題点があります。
・ProcessShellCommand()を呼ぶ前にダブルクリックされたファイル名情報が取得できない。
・ProcessShellCommand()を呼んでからならファイル名情報は取得できるのですが、その
 アプリの実行を停止すると「ファイルを開けませんでした」という感じのエラーがでて
 しまいます。
・ファイル名取得後に起動しているアプリにオープンさせたいと思いますが、どのメッセージ
 を使えばよいか?

CdS 2002/03/09(土) 22:11:58
MFCを使っているかどうかは書きましょう。
ProcessShellCommandってAPIは聞いたことないからMFCなんでしょうけど。
しかもダイアログベースではなくSDIかMDIなんでしょう。

SDI、MDIってよく分からないのでごく一般的な考えを回答します。

まず、二重起動防止はミューテックスなどを使って実現します。
で、二重起動された場合にそのファイルをオープンするには、コマンドラインの文字列を
(MFCではCWinApp::m_lpCmdLineになるんでしょうか?)起動しているウィンドウに対して
メッセージをポストしてやればいいでしょう。
もちろんそのメッセージを受けてファイルをオープンするためにはそれなりのコードは
書かないといけないんでしょうけど。

#SDI、MDIってもっと簡単にできるんでしょうか...?

sara 2002/03/15(金) 10:13:04
Cdsさんの回答だけでも十分かと思いますが、参考までに下記を見てみてください。
http://www2s.biglobe.ne.jp/~maekawa/dev/vc/tips/lib/chofuku_kidou.html
それから裏技だとここですね。
http://www.bd.wakwak.com/~opapa/VC/Bogus/SingleInst2.htm

>・ファイル名取得後に起動しているアプリにオープンさせたいと思いますが、どのメッセージ
> を使えばよいか?
 アプリケーションクラスでOpenDocumentFile()関数をオーバーライドするか、ドキュメント
クラスでOnOpenDocument()関数をオーバーライドすれば良いのではないでしょうか。

dairygoods 2002/03/15(金) 11:22:46
>・ProcessShellCommand()を呼んでからならファイル名情報は取得できるのですが、その
> アプリの実行を停止すると「ファイルを開けませんでした」という感じのエラーがでて
> しまいます。

ひょっとして、CWinApp::InitInstance() でFALSEを返して
アプリケーションを終了しているのでしょうか?
その場合、アプリケーションは初期化失敗で終了したことになるので、
エラーがでます。

>・ファイル名取得後に起動しているアプリにオープンさせたいと思いますが、どのメッセージ
> を使えばよいか?

独自のメッセージを送信するのが簡単でしょう。
ファイルオープン用のメッセージというのはありません。

ところで、ファイルオープンを1つの実行中アプリケーションに
任せたいのなら、DDEを実装するのがよいのではと思います。

hama 2002/03/15(金) 17:28:40
みなさん、返信ありがとうございます。
VC6.0(MFC)、Win2000使ってます。

dairygoodsさん、DDE実装ってEnableShellOpen()だけでいいんですかね?
これでいくと、ファイルダブルクリックを行なって起動したら問題無いんですけど、
EXEを単純に起動すると、その後にファイルダブルクリックしたものを認識して
くれないんですけど、誰かわかりますか?

sara 2002/03/18(月) 08:52:09
1つずつ問題を解決した方が良いと思われます。
まず、二重起動防止の部分を抜きにして、ダブルクリックすると起動中のアプリケーション内で
ファイルを開けるようにしてから、二重起動防止を実装してはいかがですか?

EnableShellOpen()をコールしておけば、ダブルクリックしたときにファイルを開けるように
なっているはずです。ダブルクリックすると、CWinApp::OnDDECommand が呼び出されて、DDE
実行コマンドを処理します。ファイル名などはこの関数のパラメータ文字列の中に入っているの
で、これをオーバーライドすると、ファイルを開く前に特別なチェックなどができるでしょう。
とりあえず、オーバーライドして、ブレークさせてみてはいかがですか? ここでブレークしな
かったなら、レジストリの登録に問題があるかもしれません。

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