|
製 品
サポート
|
Inno Setup知識データベースInno Setup知識データベースには付属文書やFAQに含まれていない追加の情報を納めています。 AppMutexを用いて,任意のユーザー・セッションで実行されているインスタンスを検出する方法記事作成: 2003-10-24 00:20 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.
|