dポイントプレゼントキャンペーン実施中!

お世話になります。

VC++6.0 MFCで開発しております。

現在までユーザ単位で排他制御を取るために下記のようにミューテックスを
使用しておりました。
CreateMutex(NULL,TRUE,"EXENAME")

しかしながら、今度はローカルコンピュータ単位で排他制御をかけたいのです。ネットで調べて見ますと名前付きシステム ミューテックスにするとできるみたいなのですが、どのようにすればよいのでしょうか?

お手数ですがよろしくお願いします。

A 回答 (5件)

セッションを超えてカーネルオブジェクトを共有したい場合,


名前にGlobal\という接頭辞を追加します。
MSDN: Kernel Object Namespaces (Windows)
http://msdn.microsoft.com/en-us/library/aa382954 …
    • good
    • 0

#1です。


自説にこだわるわけではないのですが、ファイル方式が良いのでは?
簡単だし、後始末の心配も無いですからね。ネットワーク全体に
拡張しても使えますし・・・
名前付きミューテックスを使うならOpenMutexで出来ているものを
取得しますが、取得できた時点でアウトですね。取得できないとして、
ヨーイドンで複数のプロセスが同じ名前のミューテックスを作るかも
知れないから、CreateMutex後にもチェックします。
また、COMを使えるなら、ミューテックスではなく、WMIプロセス管理で
自分と同名のプロセスが2個以上ないか調べるという方法もあります。
    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

>自説にこだわるわけではないのですが、ファイル方式が良いのでは?
>簡単だし、後始末の心配も無いですからね。ネットワーク全体に
>拡張しても使えますし・・・
ファイル形式の場合、途中で強制終了とかした場合、ファイルが
残りっぱなしになるので、怖いのです。。。

なんとかミューテックスで実現したいのです。

ご返事ありがとうございます。

お礼日時:2009/07/29 18:34

やったことないので無責任だけど, GetLastError は使える?

    • good
    • 0
この回答へのお礼

ご返事ありがとうございます。

GetLastErrorは現在の
CreateMutex(NULL,TRUE,"EXENAME")
で使えています!!!

よろしくお願いします。

お礼日時:2009/07/29 17:59

・名前「無し」ミューテックス


CreateMutex(NULL,TRUE,NULL)

・名前「付き」ミューテックス
CreateMutex(NULL,TRUE,"EXENAME")

>名前付きシステム ミューテックスにするとできるみたいなのですが、どのようにすればよいのでしょうか?

ミューテックスを使おうとすると、接続する方ではなく、接続された方で排他制御しなければなりません。

そうすると「サービスとして接続を提供する」など、かなり複雑な処理をしないとなりません。

であれば、他の回答のように「接続する方が、接続される端末にあるファイルを排他モードで開いてみる」と言う方法を取るしかないでしょう。

具体的な動作を参考にするなら「Microsoft Accessが、データベースファイル(mdbファイル)をオープンした時に作られる、ロックファイル(ldbファイル)の働き」を調べてみると良いでしょう。
    • good
    • 0
この回答へのお礼

私の書き方の間違いでたいへんもうしわけございません。
>ローカルコンピュータ単位で排他制御をかけたいのです。
ですが、1つのコンピュータでそのEXEは1個しか起動できないようにしたいということなのです。
複数のコンピュータ間で、1つだけというのではないのです。。。。
現在
CreateMutex(NULL,TRUE,"EXENAME")
で、AユーザでEXEを2個起動しようとしたらエラー。
Aユーザで1個。Bユーザで1個は起動OKな状態を

Aユーザで1個起動していれば、Bユーザで起動しようとしたらエラーと
したいのです。。。
お手数ですがよろしくお願いします。

お礼日時:2009/07/29 17:28

同一マシン内の異なるプロセス間で排他制御するなら分かるんですが、


異なるマシン間でミューテックスによる制御って、上手くいくんです
かね?聞いたことがないなぁ。
私の使っている手は各PCから参照できるファイルを排他モードで開く
という方法です。
尚、名前付きミューテックスは掲題の通り、第3パラメータに有効な
名前を指定するだけで作成できます。
    • good
    • 0
この回答へのお礼

私の書き方の間違いでたいへんもうしわけございません。
>ローカルコンピュータ単位で排他制御をかけたいのです。
ですが、1つのコンピュータでそのEXEは1個しか起動できないようにしたいということなのです。
複数のコンピュータ間で、1つだけというのではないのです。。。。
現在
CreateMutex(NULL,TRUE,"EXENAME")
で、AユーザでEXEを2個起動しようとしたらエラー。
Aユーザで1個。Bユーザで1個は起動OKな状態を

Aユーザで1個起動していれば、Bユーザで起動しようとしたらエラーと
したいのです。。。
お手数ですがよろしくお願いします。

お礼日時:2009/07/29 17:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!