これまで、ファイル拡張子をアプリケーションに関連付ける必要がある場合は、レジストリを変更するだけでした。しかし、私は何年もやっていないので、状況が少し変わったのではないかと心配しています. Windows 7 / Vista でレジストリ アクセス制限を回避する方法がわかりません (HKEY_CLASSES_ROOT に制限がある場合)。したがって、私はいくつかの Delphi ライブラリ、ユニット、コード スニペット、または XP、Vista、および 7 で確実に動作するものを探しています。「バックアップ」も処理するものはありますか? バックアップとは、変更を以前の関連付けに戻す可能性を意味します...
1 に答える
これにはサードパーティのコンポーネントを使用しないことをお勧めします。これは、物事をより複雑にするだけだからです。
HKEY_CURRENT_USER
とHKEY_LOCAL_MACHINE
ハイブを編集してファイルを関連付ける方法は誰もが知っていますよね? Windows Vista 以降では、前者を編集しても問題はありませんが、何らかの理由で後者を編集したい場合、つまりマシン上のすべてのユーザーの関連付けを編集したい場合は、アプリを昇格した特権で実行する必要があります。
昇格された権限でアプリケーションを実行するには、ユーザーはアイコンを右クリックして [管理者として実行] を選択します。しかし、それは醜いです。ただし、マニフェスト (XML ファイル) をアプリケーションのリソースに追加するだけで、アプリケーションを自動的に管理者として実行することができます。次に、エンド ユーザーがどのようにプログラムを起動しても、*.exe ファイルの実行時に UAC プロンプトが自動的にポップアップし、プログラムは管理者として実行され、HKEY_LOCAL_MACHINE
ハイブを完全に変更できます。このマニフェストを追加する方法の詳細は、いくつかの SO の質問で説明されています。本当に簡単です。
私の知る限り、実行中のアプリケーションが実行時に権限を「アップグレード」することはできません。したがって、アプリにボタンがあり、通常の権限で実行されている場合、次のようなことはできません。
procedure Button1.Click(Sender: TObject);
begin
SomehowGetAdminPrivileges;
ChangeLocalMachineRegistry;
SomehowGetBackNormalPrivileges;
end;
それは単に不可能です。したがって、実行時に管理者権限を必要とする何かを行う必要がある場合は、次のように外部アプリケーションを呼び出す必要があります。
procedure Button1.Click(Sender: TObject);
begin
ShellExecute(Application.Handle, nil, PChar('myapp.exe'), nil, nil, SW_SHOWNORMAL);
end;
myapp.exe にはマニフェストが必要です。これにより、昇格された特権で実行され、必要なことができるようになります。ただし、できれば myapp.exe に GUI を含めないでください。ユーザーがボタンをクリックすると、UAC プロンプトが表示され、myapp.exe がレジストリの変更を実行してから終了します。
サードパーティのコンポーネントを使用してこれを実現することは可能ですが、厄介です。
セットアップ中にレジストリを変更する必要がありますか? プロフェッショナルで無料のツールである Inno Setup を使用すると、Inno Setup にマニフェストが含まれます。したがって、setup.exe (Inno Setup でコンパイル) の起動時に UAC プロンプトが表示されますHKEY_LOCAL_MACHINE
。