• ベストアンサー

名前付きシステム ミューテックスの作り方

お世話になります。 VC++6.0 MFCで開発しております。 現在までユーザ単位で排他制御を取るために下記のようにミューテックスを 使用しておりました。 CreateMutex(NULL,TRUE,"EXENAME") しかしながら、今度はローカルコンピュータ単位で排他制御をかけたいのです。ネットで調べて見ますと名前付きシステム ミューテックスにするとできるみたいなのですが、どのようにすればよいのでしょうか? お手数ですがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

セッションを超えてカーネルオブジェクトを共有したい場合, 名前にGlobal\という接頭辞を追加します。 MSDN: Kernel Object Namespaces (Windows) http://msdn.microsoft.com/en-us/library/aa382954.aspx

その他の回答 (4)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

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

kgyqk433
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

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

kgyqk433
質問者

お礼

ご返事ありがとうございます。 GetLastErrorは現在の CreateMutex(NULL,TRUE,"EXENAME") で使えています!!! よろしくお願いします。

回答No.2

・名前「無し」ミューテックス CreateMutex(NULL,TRUE,NULL) ・名前「付き」ミューテックス CreateMutex(NULL,TRUE,"EXENAME") >名前付きシステム ミューテックスにするとできるみたいなのですが、どのようにすればよいのでしょうか? ミューテックスを使おうとすると、接続する方ではなく、接続された方で排他制御しなければなりません。 そうすると「サービスとして接続を提供する」など、かなり複雑な処理をしないとなりません。 であれば、他の回答のように「接続する方が、接続される端末にあるファイルを排他モードで開いてみる」と言う方法を取るしかないでしょう。 具体的な動作を参考にするなら「Microsoft Accessが、データベースファイル(mdbファイル)をオープンした時に作られる、ロックファイル(ldbファイル)の働き」を調べてみると良いでしょう。

kgyqk433
質問者

お礼

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

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

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

kgyqk433
質問者

お礼

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