- PR -

VC++ 実行アプリケーションの2重起動防止について

投稿者投稿内容
ookura
会議室デビュー日: 2006/02/19
投稿数: 6
投稿日時: 2006-02-19 20:25
はじめましてookuraといいます
VC++6.0を初めて2週間です。

VC++6.0
OS:WindowsXP

実行アプリケーションの2重起動防止をしようとしています。
いままでいろいろと検索し、Mutexを使用するのがよいと思い、実際に試しています。

ただ、CreateMutexの使用方法がわかっていません。

簡単に、notpadを2重起動防止する場合、以下のようにコーディングしています。

----------------------------------------------------------------------
#include <windows.h>
int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,LPSTR lpsCmdLine,int cMdShow){

HANDLE hMutex;
hMutex = (NULL,TRUE,"ここに何を書くのかわかっていません");
if (!hMutex)
return 0;
if (GetLastError() == ERROR_ALREADY_EXISTS) {
return 0;
}

WinExec("notepad.exe",SW_SHOW);

return 0;
}

---------------------------------------------------------------------------
hMutex = (NULL,TRUE,"ここに何を書くのかわかっていません");
上記に記述したとおりなのですが、notepad.exeを2重起動防止するように、Mutexを使用する場合、どのように何を記述すればよろしいでしょうか?


ご教授ください。宜しくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-19 20:59
引用:

ookuraさんの書き込み (2006-02-19 20:25) より:

hMutex = (NULL,TRUE,"ここに何を書くのかわかっていません");
上記に記述したとおりなのですが、notepad.exeを2重起動防止するように、Mutexを使用する場合、どのように何を記述すればよろしいでしょうか?


第 3 引数は識別名です。
Notepad であれば自由で良いと思いますが、通常はプロセス名などにするでしょう。

VC6 はないけど、参考リンク。

  二重起動を確実に禁止する

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ookura
会議室デビュー日: 2006/02/19
投稿数: 6
投稿日時: 2006-02-19 21:06
>じゃんぬねっと様
ご返信有難うございます。


引用:
--------------------------------------------------------------------------------
第 3 引数は識別名です。
Notepad であれば自由で良いと思いますが、通常はプロセス名などにするでしょう。
--------------------------------------------------------------------------------

hMutex = (NULL,TRUE,"notepad");
と記述しました。
コンパイルは当然通っているのですが、実行ファイル(.exe)をダブルクリックすると
notepadが何個も起動してしまいます。

ロジック自体が間違えているといことなのでしょうか?

[ メッセージ編集済み 編集者: ookura 編集日時 2006-02-20 00:13 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-02-19 21:09

このコードのままだと、実行ファイルが終了しているので当然 Mutex も解放されてしまいますが。
ookura
会議室デビュー日: 2006/02/19
投稿数: 6
投稿日時: 2006-02-19 21:16
>Hongliang様
ご返信有難うございます。

引用
-------------------------------------------------------------------------------
このコードのままだと、実行ファイルが終了しているので当然 Mutex も解放されてしまいますが。
-------------------------------------------------------------------------------

自分のプログラム以外で使用する他のアプリケーションの2重起動防止については、この方法だと適していない・・・
ということなんでしょうか?

確かにMutexオブジェクトが開放されては、何度のnotepadが起動されてしまいすね・・・・。


[ メッセージ編集済み 編集者: ookura 編集日時 2006-02-20 00:13 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-19 21:22
引用:

ookuraさんの書き込み (2006-02-19 21:16) より:

確かにMutexオブジェクトが開放されては、何度のnotepadが起動されてしまいすね・・・・。


いや、Notepad の場合、どちらにしても外部からの起動は受け付けちゃいますよね。
Notepad は例で自アプリケーションの二重起動を防止したいのだと思っていたのですが...
最終的に何をなさりたいのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ookura
会議室デビュー日: 2006/02/19
投稿数: 6
投稿日時: 2006-02-19 21:26
引用
-----------------------------------------------------------------------------
いや、Notepad の場合、どちらにしても外部からの起動は受け付けちゃいますよね。
Notepad は例で自アプリケーションの二重起動を防止したいのだと思っていたのですが...
最終的に何をなさりたいのでしょうか?
-----------------------------------------------------------------------------

>じゃんぬねっと様
最終的には、notepadのような自アプリケーション以外ののアプリを起動させたいと思っています。

最初に何をしたいのか明確にしておりませんでした。




[ メッセージ編集済み 編集者: ookura 編集日時 2006-02-19 21:27 ]

[ メッセージ編集済み 編集者: ookura 編集日時 2006-02-19 21:31 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-02-19 21:48
API の使い方云々よりも、根本的なところに思い違いがあるような気がします。

引用:

最終的には、notepadのような自アプリケーション以外ののアプリを起動させたいと思っています。



それは Mutex では制御できません。

CreateMutex() してみたところで、その Mutex の存在をチェックするコードが、この場合は Notepad.exe に存在しなければ、まったくの無意味です。

元々複数起動を許しているアプリケーションを、外部から複数起動禁止にするのはかなり難しいです。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-02-19 21:54 ]

スキルアップ/キャリアアップ(JOB@IT)