2017-12-30 52 views
1

Die Funktion ShellFindExecutable ermöglicht das Programm zu finden, die mit einem bestimmten Dateityp verknüpft ist:Abrufen der standardmäßigen zugeordneten Dateitypen einer Anwendung?

function ShellFindExecutable(const FileName, DefaultDir: string): string; 
var 
    Res: HINST; 
    Buffer: array [0..MAX_PATH-1] of Char; 
    I: Integer; 
begin 
    ResetMemory(Buffer, SizeOf(Buffer)); 
    Res := FindExecutable(PChar(FileName), PCharOrNil(DefaultDir), Buffer); 
    if Res > 32 then 
    begin 
    // FindExecutable replaces #32 with #0 
    for I := Low(Buffer) to High(Buffer) - 1 do 
     if Buffer[I] = #0 then 
     Buffer[I] := #32; 
    Buffer[High(Buffer)] := #0; 
    Result := Trim(Buffer); 
    end 
    else 
    Result := ''; 
end; 

Zum Beispiel:

DefProgram := ShellFindExecutable('R:\test.txt', ''); 
// DefProgram: C:\Program Files (x86)\Notepad++\notepad++.exe 

Aber wie kann ich den Dateityp (n)/Erweiterung finden (s) für welche ein bestimmtes existierendes Programm die standardmäßig zugeordnete Anwendung ist?

Delphi 10.1 Berlin Windows 7 x64

+0

Iterieren Sie durch jede registrierte Erweiterung und prüfen Sie, ob die zugehörige Anwendung Ihr Ziel ist. Auch das Jonglieren mit Space-Charakteren sieht völlig falsch aus. –

+0

"Iterate durch jede registrierte Erweiterung" scheint logisch. Ich habe mich nur gefragt, ob es eine explizite Funktion dafür gibt. - Welche Alternative würdest du für "Jonglieren mit Space Characters" vorschlagen? – user1580348

+0

Ich glaube nicht, dass FindExecutable das tut, was Sie behaupten. Wie auch immer, für eine wichtige Aufgabe wie diese würde ich erwarten, dass IQueryAssociations der effizienteste Mechanismus sein wird. –

Antwort

1

Ich glaube nicht, dass es eine API-Funktion ist speziell, das zu tun. Sie müssen jede registrierte Erweiterung durchlaufen, z. B. indem Sie Schlüssel in HKCR aufzählen und prüfen, welche ausführbare Datei dem offenen Verb zugeordnet ist.

Anstelle von FindAssociation vermute ich, dass IQueryAssociations effizienter und robuster sein wird.

Darüber hinaus, was Sie über FindAssociation ersetzen Leerzeichen mit Nullen ist einfach nicht wahr. Sie können den Text Ihrer if-Anweisung durch Result := Buffer ersetzen.

+0

Danke! Können Sie einen Beispielcode angeben? – user1580348

+0

Nicht wirklich. Ich bin sicher, du kannst das tun. Sie müssen nur über HKCR iterieren. Du hast alles andere. Es ist dann eine Übung, um zu sehen, ob die Verwendung von IQueryAssociations schneller ist. –

Verwandte Themen