Frage

Ich brauche den Namen des Programms zur Zeit mit der Dateierweiterung für den aktuellen Benutzer verbunden zu bekommen. Wenn Sie mit der rechten Maustaste auf eine Datei und wählen Sie Eigenschaften, was dann muß ich der Programmname, der auf der rechten Seite der „beginnt mit“ -Linie ist.

z. Für „.xls“, möchte ich die Antwort ‚Microsoft Office Excel‘ in der Lage sein zu bekommen, oder was auch immer Programm der Benutzer als Standard-Programm zu öffnen .xls-Dateien.

Ich habe festgestellt, es ist nicht so einfach wie nur in HKEY_CLASSES_ROOT gehen und Kommissionierung es aus, da es auch in HKEY_LOCAL_MACHINE oder HKEY_CURRENT_USER oder HKEY_USERS angegeben werden.

Vielleicht alles, was ich wissen müssen, ist die Hackordnung von Windows verwendet, dies zu bestimmen und wie an jedem der Standorte zu erhalten. Natürlich kann ein Windows API-Aufruf dieses Ideal wäre zu tun.

Dies ist eine ähnliche Frage: Wie Symbol und Beschreibung von Dateierweiterung erhalten Delphi mit? aber diese Frage nur beantworten, wie die Beschreibung der Erweiterung zu erhalten und der Symbol des zugehörigen Programms. Ich kann nicht einen Weg finden, zu erweitern, dass auch den Namen des zugehörigen Programms.

Ich bin mit Delphi 2009 und benötigen eine Lösung, die funktioniert unter Windows XP, Vista und 7.


Vielen Dank für Ihre Antworten.

Es scheint, meinen Glauben, dass der Name der ausführbaren Datei ist in der Registry nicht, nachdem alle. Und nach einem Blick um ausgiebig für einen Windows-API, die den Namen gibt, konnte ich nicht finden.

ich glaube, Mef Antwort dann ist die beste. Um den Namen der ausführbaren Datei von der mitgelieferten Informationen in der Programm ausführbare Datei.

War es hilfreich?

Lösung

Schritt 1

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

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;

(Siehe hier oder marc_s' anwser auf diese Frage: - )

Schritt 2

Nun können Sie den Namen des Programms aus den Versionsinformationen dieser ausführbaren Datei ausgelesen! Der einfachste Weg, um die TVersionInfo Klasse wird mit Ihnen über Google finden, zum Beispiel hier .

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

Allerdings müssen Sie sich bewusst sein, dass einige Programme daher die Beschreibung Schlüssel verwenden (wie RAD Studio selbst oder MS Excel), während andere die Produktnamen Taste ...

Andere Tipps

Gehen Sie nicht in der Registrierung Spelunking wenn API-Funktionen sind entworfen, um zu tun, was Sie brauchen.

In Ihrem Fall sollten Sie AssocQueryString . Sie können die Dateinamenerweiterung geben, und es wird Dir das Programm sagen registriert, dass die Erweiterung zu handhaben (AssocStr_Executable). Wenn Sie planen, auf läuft das Programm ein Dokument zu öffnen, dann werden Sie wirklich die Befehlsfolge, anstatt nur die ausführbare Datei wollen; AssocQueryString können Sie das geben, auch (AssocStr_Command). Es kann Ihnen auch sagen, den Dokumenttyp wie das, was in Windows Explorer, wie „Textdokument“ oder „Zip-Archiv“ (AssocStr_FriendlyDocName).

angezeigt ist

Die API-Funktion ist ein Wrapper für das IQueryAssociations Schnittstelle. Wenn Sie Programme aus vielen Dateitypen, oder vielen Saiten, die mit einem einzigen Typ suchen, können Sie möchten, dass die Schnittstelle und Wiederverwendung instanziieren es stattdessen die API-Funktion über und über von Aufrufen.

Delphi kommt mit einer Einheit ShellApi.pas, die unten in dem Beispielcode verwendet wird. Die Datei muss vorhanden sein.

Hier ist, wie es zu benutzen:

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;

Ich denke, dass Sie MEFs und Rob Kennedy Antworten kombinieren müssen.

Nehmen Sie die Antwort von Rob Kennedy und nehmen Sie Schritt 2 von Mef Antwort. direkt lesen Registrierung ist nicht gut, was zu tun, so dass Sie 1 seinen Teil wegwerfen sollte.

  

Aber ich bin nicht für den angezeigten Namen des Dateitypen suchen.

AssocQueryString kehrt nicht nur Namen für Dateityp ( ASSOCSTR_FRIENDLYDOCNAME ), sondern kann auch den Namen der ausführbaren Datei zu öffnen Datei zurück ( ASSOCSTR_EXECUTABLE ) - das ist das, was Sie brauchen,

.

Noch mehr als das: Ich bin nicht sicher, aber sein kann, ASSOCSTR_FRIENDLYAPPNAME Ihren Anforderungen entsprechen wird. In diesem Fall können Sie nur Rob Kennedy Antwort verwenden.

Das Problem mit Registry liest direkt ist, dass es falsch Info zurückkehren. Das ist, weil Sie die Systemeinstellungen zu lesen - das ist, was Anwendung registriert. Aber Benutzer kann dies außer Kraft setzen. Zum Beispiel kann er direkt auf .xls klicken und wählen Sie „Öffnen mit ...“ - „Andere App“> -> "Open Office" -> "Verwenden Sie diese App immer". Registrierungsinformationen für .xls-Typ wird nicht verändert (Benutzereinstellungen werden in separaten Ort gespeichert, so dass Anwendungen kann nicht verwirren mit ihnen), so dass Ihr Code (die Registrierung direkt liest) wird auch weiterhin „MS Excel“ produzieren, obwohl, wenn Benutzer einen Doppelklick auf Datei -. Openoffice gestartet werden

Wie zu diesem Artikel hier: die zugehörige Anwendung Bestimmung

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

Wenn Sie nach Excel.Sheet.8 suchen gehen wieder in HKEY_CLASSES_ROOT, werden Sie einen Eintrag mit einem Standardwert von Microsoft Office Excel 97-2003 Worksheet finden - das ist wahrscheinlich so gut wie es nur geht.

Wenn der Benutzer sagt, dass „diese App nutzt immer“ für .xls-Dateien, die die Informationen sind gespeichert in

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

Der Schlüssel hat einen Eintrag „Application“ enthält den Namen der Anwendung (beispielsweise „soffice.exe“). Es ist korreliert mit einem Applcication Schlüssel in HK_CR, z.B. HK_CR\Applications\soffice.exe\

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top