9

現在のユーザーのファイル拡張子に現在関連付けられているプログラムの名前を取得する必要があります。ファイルを右クリックしてプロパティを選択すると、「Opens with」行の右側にあるプログラム名が必要になります。

たとえば、".xls" の場合、"Microsoft Office Excel" という回答、またはユーザーが .xls ファイルを開くための既定のプログラムとして使用している任意のプログラムを取得できるようにしたいと考えています。

HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER、または HKEY_USERS でも指定されている可能性があるため、HKEY_CLASSES_ROOT に移動してそれを選択するほど簡単ではないと判断しました。

おそらく、私が知る必要があるのは、Windows がこれを決定するために使用する序列と、各場所へのアクセス方法だけです。もちろん、これを行うための Windows API 呼び出しが理想的です。

これは、次のような質問です: How to get icon and description from file extension using Delphi? しかし、その質問は、拡張機能の説明と関連するプログラムのアイコンを取得する方法のみに答えました。それを拡張して、関連するプログラムの名前も取得する方法が見つかりませんでした。

Delphi 2009 を使用していますが、Windows XP、Vista、および 7 で動作するソリューションが必要です。


回答ありがとうございます。

結局、実行可能ファイルの名前がレジストリにないというのが私の信念のようです。そして、名前を付ける Windows API を広範囲に探した後、見つけられませんでした。

そのときのメフの答えが一番だと思います。プログラムの実行可能ファイルに含まれる情報から実行可能ファイルの名前を取得します。


フォローアップ: 「デフォルトのテキスト エディタでファイルを開くにはどうすればよいですか?」に対する David Hefferman の回答を見つけました。別の拡張子の既定のプログラムを使用して 1 つのプログラムを開くための優れたソリューションを提供します。

4

6 に答える 6

11

必要なことを行うように設計された API 関数がある場合は、レジストリを詳しく調べないでください。

あなたの場合、あなたが欲しいAssocQueryString. ファイル名拡張子を付けると、その拡張子を処理するように登録されたプログラムに通知されます ( AssocStr_Executable)。そのプログラムを実行してドキュメントを開くことを計画している場合は、実行可能ファイルだけでなく、コマンド文字列が本当に必要になります。AssocQueryStringあなたにもそれを与えることができます(AssocStr_Command)。また、「テキスト ドキュメント」や「Zip アーカイブ」( ) など、Windows エクスプローラーに表示されるドキュメントの種類もわかりますAssocStr_FriendlyDocName

その API 関数は、IQueryAssociationsインターフェイスのラッパーです。多くのファイル タイプ、または 1 つのタイプに関連付けられた多数の文字列からプログラムを探している場合は、API 関数を何度も呼び出す代わりに、そのインターフェイスをインスタンス化して再利用することをお勧めします。

于 2010-04-06T15:19:34.310 に答える
5

Delphi には、以下のサンプル コードで使用されるユニット ShellApi.pas が付属しています。ファイルが存在する必要があります。

使用方法は次のとおりです。

function MyShellFindExecutable(const aFileName: string): string;
var
  Buffer: array[0..WINDOWS.MAX_PATH] of Char;
begin
  Result := '';
  FillChar(Buffer, SizeOf(Buffer), #0);
  if (SHELLAPI.FindExecutable(PChar(aFileName), nil, Buffer) > 32) then
    Result := Buffer;
end;
于 2010-04-06T01:35:39.850 に答える
4

Mef と Rob Kennedy の回答を組み合わせる必要があると思います。

Rob Kennedy の回答を参考にして、Mef の回答からステップ 2 を実行してください。レジストリを直接読むのはよくないので、パート 1 は破棄する必要があります。

しかし、ファイルの種類のわかりやすい名前を探しているわけではありません。

AssocQueryString は、ファイル タイプのわかりやすい名前 ( ASSOCSTR_FRIENDLYDOCNAME ) を返すだけでなく、ファイルを開く実行可能ファイルの名前 ( ASSOCSTR_EXECUTABLE ) を返すこともできます。これが必要なものです。

それ以上: よくわかりませんが、ASSOCSTR_FRIENDLYAPPNAMEがあなたのニーズに合うかもしれません。その場合、Rob Kennedy の回答のみを使用できます。

レジストリを直接読み取る際の問題は、間違った情報が返される可能性があることです。これは、システム設定を読み取ったためです。これは、アプリケーションが登録したものです。ただし、ユーザーはこれをオーバーライドできます。たとえば、.xls を右クリックし、[プログラムから開く...] -> [他のアプリ] を選択します。→「OpenOffice」→「常にこのアプリを使う」。.xls タイプの登録情報は変更されません (ユーザー設定は別の場所に保存されるため、アプリがそれらをいじることはできません)。ユーザーがファイルをダブルクリックすると、OpenOffice が起動します。

于 2010-04-12T09:26:02.160 に答える
4

ステップ1

たとえば、次の関数を使用して、ファイル拡張子に割り当てられた実行可能ファイルを取得します。

uses Registry, Windows, SysUtils;

function GetAssociation(const DocFileName: string): string;
var
  FileClass: string;
  Reg: TRegistry;
begin
  Result := '';
  Reg := TRegistry.Create(KEY_EXECUTE);
  Reg.RootKey := HKEY_CLASSES_ROOT;
  FileClass := '';
  if Reg.OpenKeyReadOnly(ExtractFileExt(DocFileName)) then
  begin
    FileClass := Reg.ReadString('');
    Reg.CloseKey;
  end;
  if FileClass <> '' then begin
    if Reg.OpenKeyReadOnly(FileClass + '\Shell\Open\Command') then
    begin
      Result := Reg.ReadString('');
      Reg.CloseKey;
    end;
  end;
  Reg.Free;
end;

こちら、またはこの質問に対するmarc_sの回答を参照してください:-)

ステップ2

これで、この実行可能ファイルのバージョン情報からプログラムの名前を読み取ることができます! 最も簡単な方法は、Google 経由で見つけることができる TVersionInfo クラスを使用することです

var VersionInfo: TVersionInfo;  
VersionInfo := TVersionInfo.Create('PathToExe\name.exe');  
s := VersionInfo.KeyValue['Description'];

ただし、プログラムによっては説明キーを使用するもの (RAD Studio 自体や MS Excel など) もあれば、製品名キーを使用するものもあることを認識しておく必要があります...

于 2010-04-05T20:09:15.597 に答える
3

この記事はいかがですか:関連するアプリケーションの決定

Excel の具体的なケースでは、.xls拡張子は HKEY_CLASSES_ROOT の下にあります。そのエントリのデフォルト値は ですExcel.Sheet.8

Excel.Sheet.8HKEY_CLASSES_ROOT でもう一度検索すると、デフォルト値がMicrosoft Office Excel 97-2003 Worksheet- であるエントリが見つかります。

于 2010-04-05T07:04:37.820 に答える
0

ユーザーが.xlsファイルに対して「このアプリを常に使用する」と言った場合、情報は保存されません

HK_CU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xls

キーには、アプリケーション名(「soffice.exe」など)を含むエントリ「Application」があります。これは、HK_CRのアプリケーションキーに関連付けられています。HK_CR\Applications\soffice.exe\

于 2010-07-30T10:08:11.247 に答える