Wie kann ich den Namen des Programms, der mit einer Dateierweiterung verknüpft ist, mit Delphi erhalten?

7

Ich muss den Namen des Programms erhalten, das derzeit mit einer Dateierweiterung für den aktuellen Benutzer verknüpft ist. Wenn Sie mit der rechten Maustaste auf eine Datei klicken und Eigenschaften auswählen, benötige ich den Programmnamen rechts neben der Zeile "Öffnet mit".

z.B. Für ".xls" möchte ich die Antwort "Microsoft Office Excel" erhalten, oder welches Programm der Benutzer als Standardprogramm zum Öffnen von .xls-Dateien hat.

Ich habe festgestellt, dass es nicht so einfach ist, in HKEY_CLASSES_ROOT zu gehen und es auszuwählen, da es auch in HKEY_LOCAL_MACHINE oder HKEY_CURRENT_USER oder HKEY_USERS angegeben werden kann.

Vielleicht ist alles, was ich wissen muss, die Hackreihenfolge, die Windows verwendet, um dies zu bestimmen und wie man zu jedem der Orte kommt. Natürlich wäre ein Windows-API-Aufruf dafür ideal.

Dies ist eine ähnliche Frage zu: Wie man Icon und Beschreibung von der Dateierweiterung mit Delphi bekommt? aber diese Frage beantwortete nur, wie man die Beschreibung der Erweiterung und des Symbol des zugehörigen Programms. Ich konnte keine Möglichkeit finden, das zu erweitern, um auch den Namen des zugehörigen Programms zu erhalten.

Ich benutze Delphi 2009 und brauche eine Lösung, die unter Windows XP, Vista und 7 funktioniert.

Vielen Dank für Ihre Antworten.

Ich glaube, dass der Name der ausführbaren Datei nicht in der Registry enthalten ist. Und nachdem ich mich intensiv nach einer Windows-API umgesehen habe, die den Namen liefert, konnte ich keinen finden.

Ich denke, dass Mefs Antwort dann die beste ist. Um den Namen der ausführbaren Datei aus den Informationen zu erhalten, die in der Programmdatei enthalten sind.

    
lkessler 05.04.2010, 06:36
quelle

6 Antworten

3

Schritt 1

Holen Sie sich die ausführbare Datei, die einer Dateierweiterung zugeordnet ist, zum Beispiel mit der folgenden Funktion:

%Vor%

(Siehe hier , oder marc_s 'anwser zu dieser Frage: -)

Schritt 2

Jetzt können Sie den Namen des Programms aus der Versionsinformation dieser ausführbaren Datei auslesen! Der einfachste Weg ist die Verwendung der TVersionInfo-Klasse, die Sie über Google finden können, zum Beispiel hier .

%Vor%

Sie müssen jedoch beachten, dass einige Programme den Beschreibungsschlüssel verwenden (wie RAD Studio selbst oder MS Excel), während andere den Produktnamenschlüssel verwenden ...

    
Leo 05.04.2010, 20:09
quelle
9

Gehen Sie nicht in die Registrierung, wenn es API-Funktionen gibt, die dafür ausgelegt sind, das zu tun, was Sie brauchen.

In Ihrem Fall möchten Sie AssocQueryString . Sie können ihm die Dateinamenerweiterung geben, und er wird Ihrem Programm mitteilen, dass es für die Verarbeitung dieser Erweiterung registriert ist ( AssocStr_Executable ). Wenn Sie vorhaben, das Programm zum Öffnen eines Dokuments auszuführen , möchten Sie wirklich die Befehlszeichenfolge und nicht nur die ausführbare Datei verwenden. AssocQueryString kann dir das auch geben ( AssocStr_Command ). Es kann Ihnen auch den Dokumenttyp anzeigen, wie er im Windows Explorer angezeigt wird, wie "Textdokument" oder "Zip-Archiv" ( AssocStr_FriendlyDocName ).

Diese API-Funktion ist ein Wrapper für die IQueryAssociations -Schnittstelle. Wenn Sie nach Programmen aus vielen Dateitypen oder vielen Strings suchen, die einem einzelnen Typ zugeordnet sind, möchten Sie möglicherweise diese Schnittstelle instanziieren und erneut verwenden, anstatt die API-Funktion immer wieder aufzurufen.

    
Rob Kennedy 06.04.2010 15:19
quelle
4

Delphi enthält eine Unit ShellApi.pas, die im folgenden Beispielcode verwendet wird. Die Datei muss existieren.

So verwenden Sie es:

%Vor%     
RobertFrank 06.04.2010 01:35
quelle
4

Ich denke, dass Sie die Antworten von Mef und Rob Kennedy kombinieren müssen.

Nehmen Sie Rob Kennedys Antwort und machen Sie Schritt 2 von Mefs Antwort. Es ist nicht gut, die Registry direkt zu lesen, also solltest du seinen Teil 1 wegschmeißen.

  

Aber ich suche nicht nach dem Anzeigenamen des Dateityps.

AssocQueryString gibt nicht nur den Anzeigenamen für den Dateityp zurück ( ASSOCSTR_FRIENDLYDOCNAME ) , aber es kann auch den Namen der ausführbaren Datei zurückgeben, um die Datei zu öffnen ( ASSOCSTR_EXECUTABLE ) ) - das ist was du brauchst.

Mehr noch: Ich bin mir nicht sicher, aber vielleicht ASSOCSTR_FRIENDLYAPPNAME entspricht Ihren Bedürfnissen. In diesem Fall können Sie nur die Antwort von Rob Kennedy verwenden.

Das Problem mit dem Lesen der Registrierung direkt ist, dass es falsche Informationen zurückgeben kann. Das liegt daran, dass Sie Systemeinstellungen lesen - das ist die registrierte Anwendung. Aber Benutzer kann dies überschreiben. Zum Beispiel kann er mit der rechten Maustaste auf .xls klicken und "Öffnen mit ..." auswählen - & gt; "Andere App." - & gt; "OpenOffice" - & gt; "Benutze diese App immer". Die Registrierungsinformationen für den XLS-Typ werden nicht geändert (die Benutzereinstellungen werden an einem separaten Ort gespeichert, sodass Apps nicht mit ihnen umgehen können). Daher wird der Code (der die Registrierung direkt liest) weiterhin "MS Excel" erstellen Benutzer doppelklickt auf Datei - OpenOffice wird gestartet.

    
Alex 12.04.2010 09:26
quelle
3

Wie wäre es mit diesem Artikel hier: Ermitteln der zugehörigen Anwendung

Im konkreten Fall von Excel finden Sie die Erweiterung .xls unter HKEY_CLASSES_ROOT - der Standardwert dieses Eintrags ist Excel.Sheet.8 .

Wenn Sie in HKEY_CLASSES_ROOT erneut nach Excel.Sheet.8 suchen, finden Sie einen Eintrag mit dem Standardwert Microsoft Office Excel 97-2003 Worksheet - das ist wahrscheinlich so gut wie es geht.

    
marc_s 05.04.2010 07:04
quelle
0

Wenn der Benutzer für .xls-Dateien "Diese App immer verwenden" sagt, wird die Information in

gespeichert %Vor%

Der Schlüssel hat einen Eintrag "Anwendung", der den Anwendungsnamen enthält (z. B. "soffice.exe"). Es ist mit einem Anwendungsschlüssel in HK_CR korreliert, z. HK_CR\Applications\soffice.exe\

    
Tontyna 30.07.2010 10:08
quelle