二重起動防止とドキュメントオープン – プログラミング – Home

二重起動防止とドキュメントオープン
 
通知
すべてクリア

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


hama
 hama
(@hama)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

アプリケーション実行時に二重起動を防止しています。
ドキュメントファイルをダブルクリックされたときに、既にアプリ実行中の場合はその
ウィンドウにダブルクリックされたファイルをオープンしたいのですが、現在うまくい
きません。

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


引用解決済
トピックタグ
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

MFCを使っているかどうかは書きましょう。
ProcessShellCommandってAPIは聞いたことないからMFCなんでしょうけど。
しかもダイアログベースではなくSDIかMDIなんでしょう。

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

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

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


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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

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

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

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


返信引用
hama
 hama
(@hama)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

みなさん、返信ありがとうございます。
VC6.0(MFC)、Win2000使ってます。

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


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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