jrsoftware.org // Jordan Russell's Software
-Home

製  品

-Inno Setup


-Toolbar2000

-Toolbar97

-StripReloc

-その他...

サポート

-ニュースグループ

-連絡先

Inno Setup知識データベース

Inno Setup知識データベースには付属文書やFAQに含まれていない追加の情報を納めています。
(訳注:以下に示す情報は,2004年4月6日時点のスナップショットです。最新の情報に関しては,こちらをご覧下さい。)

AppMutexを用いて,任意のユーザー・セッションで実行されているインスタンスを検出する方法

記事作成: 2003-10-24 00:20 GMT by Jordan Russell
最終更新: 2003-10-24 01:32 GMT by Jordan Russell


Windows XPの素早いユーザーの切り替え(Fast User Switching)やWindows NT/2000/2003のターミナル・サービスでは, AppMutex はデフォルトでは,セットアップ・プログラムないしアンインストーラが実行されているセッション以外のセッションで作成されたミューテックスを検出することができません。これは,ユーザーセッションにはそれぞれ独自のカーネルの名前空間があるからです。

他のセッションで作成されたミューテックスを検出するには,ミューテックスを2つ作成しなければなりません。 Global\ プレフィックスありのものとなしのものです。

Global\ プレフィックスありのミューテックスはどのユーザーのセッションからもアクセスできます。セキュリティ上の制限やOSでサポートされていない(バージョン4.0より前のWindows NTのターミナル・サーバー版では, Global\ プレフィックスをサポートしていません)せいで,グローバルなミューテックスの作成が失敗した場合に備えて,セッションの名前空間内に同じような名前(たとえば, Global\ プレフィックスなしのもの)のミューテックスを作成する必要もあります。

その上,ミューテックスが他のユーザーから確実にアクセスできるようにするため,CreateMutex()を呼び出すたびに特別なセキュリティ・ディスクリプタを渡さなければなりません。

次に示すのは,Delphiでこの2つのミューテックスを作成する方法の一例です:

procedure CreateMutexes(const MutexName: String);
{ インストーラないしアンインストーラが実行されているかどうかをチェックするために
  2つのミューテックスを作成する。
  一方のミューテックスはグローバルな名前空間内に作成される(こうすることで,
  Windows XPでは全ユーザーがミューテックスにアクセスできる)
  もう一方のミューテックスは,そのセッションの名前空間内に作成される(バージョン4.0
  より前のWindows NTのターミナル・サーバー版では,'Global\'プレフィックスがサポート
  されていないため)。}
const
  SECURITY_DESCRIPTOR_REVISION = 1;  { Win32定数はDelphi 3では未定義 }
var
  SecurityDesc: TSecurityDescriptor;
  SecurityAttr: TSecurityAttributes;
begin
{ Windows NTではデフォルトで,作成されたミューテックスはそのプロセスを実行している
  ユーザーしかアクセスできない。Windows XPでどのユーザーセッションでもミューテックス
  検出がうまくできるようにするには,全てのユーザーがミューテックスにアクセスできなけ
  ればならない。そのためには,空のDACL(a null DACL)を持つセキュリティ・ディスクリプタを
  使用する。}
  InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION);
  SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.lpSecurityDescriptor := @SecurityDesc;
  SecurityAttr.bInheritHandle := False;
  CreateMutex(@SecurityAttr, False, PChar(MutexName));
  CreateMutex(@SecurityAttr, False, PChar('Global\' + MutexName));
end;

...

begin
  CreateMutexes('ここにミューテックス名を書きます');
end;

In your script, set AppMutex as follows:

[Setup]
AppMutex=ここにミューテックス名を書きます,Global\ここにミューテックス名を書きます

Site contents Copyright © 1997-2004 Jordan Russell. All rights reserved.

Current category: Alphisation - Misc > Documents > Inno Setup, ISTool, ヘルプファイルの日本語化 | Salvaged by: Nardog