Autor Beitrag
knightkiller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

WinXP SP2
D7 Pers, D2005 Pers
BeitragVerfasst: Fr 19.07.02 10:19 
Ich sollte eine Funktion haben, der man eine Dateiendung übergeben kann, und die mir dann die Bezeichnung zu der Datei zurückgibt.

also etwa so:
ausblenden Quelltext
1:
2:
3:
4:
5:
function GibDateibezeichnung(typ : String) : string;
...
begin
  showmessage(GibDateibezeichnung('rar'));
end;

Dann sollte eine Mitteilung kommen: WinRAR-Archiv

Hat jemand eine Ahnung, wie ich zu diesen Informationen komme?
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.07.02 10:54 
Hi.

Eine API-Funktion ist mir im Augenblick nicht bekannt (ist aber eine interessante Frage :-)), für´s Erste wäre daher mein Vorschlag, dass du in der Registry selbst aktiv wirst.

Mit anderen Worten:

1. HKEY_CLASSES_ROOT öffnen und nach der Endung, z.B. .rar, suchen. (Der Punkt vor der Endung ist in dem Fall wichtig!)

2. Den Default-String auslesen, der dann auf den Dateityp zeigt; in dem Fall WinRar.

3. Diesen Schlüssel öffnen (ist ebenfalls in HKCR), und auch hier den Default-String auslesen. Und -voilá- du hast die Bezeichnung. Zur Sicherheit prüfst du noch, ob der String ein Leerstring ist und gibst in dem Fall vielleicht "Unbekannter Typ" zurück.

Ich gucke mal, ob´s vielleicht eine API-Funktion dafür gibt, mit der es möglicherweise leichter geht.

Gruß,
Mathias.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.07.02 11:27 
Als mögliche Alternative wäre die API-Funktion "SHGetFileInfo" (Unit ShellAPI.pas) zu nennen, der du den kompletten Dateinamen und nicht nur die Endung übergibst. Hier mal die C-Deklaration aus dem PSDK:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
DWORD_PTR SHGetFileInfo(
    LPCTSTR pszPath, // Dateiname
    DWORD dwFileAttributes, // kann hier Null sein
    SHFILEINFO* psfi, // Variable vom Typ TSHFileInfo
    UINT cbFileInfo, // Größe dieser Variable (sizeof())
    UINT uFlags // SHGFI_TYPENAME
);

Auf die Schnelle habe ich festgestellt, dass der Rückgabewert Eins ist, wenn die Sache funktioniert hat, bzw. Null, wenn die Datei z.B. nicht existiert. Rufst du die Funktion also auf, kannst du dir danach mit
ausblenden Quelltext
1:
ShowMessage(shi.szTypeName);					

ebenfalls die Typenbezeichnung anzeigen lassen. "shi" ist meine TSHFileInfo-Variable, und: Nein, ich habe kein T am Ende vergessen. :wink:
knightkiller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

WinXP SP2
D7 Pers, D2005 Pers
BeitragVerfasst: Fr 19.07.02 11:41 
habe den Dateiname nicht, nur die Endung...

aber ich habe mal in der Zwischenzeit etwas mit der Registry gebastelt, funktioniert aber nicht... (reg.ReadString('(Standard)') liefert IMMER '' zurück?!)

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
function TFrmMain.GetFileType(Typ : String) : String;
var reg : TRegistry;
    std : String;
begin
  reg := TRegistry.Create;
  std := Uppercase(typ)+'-Datei';
  try
    reg.RootKey := HKEY_CLASSES_ROOT;

    if Typ = 'xxx' then begin
      Result := 'Unbekannte Datei';
      FreeAndNil(reg);
      exit;
    end;

    if not reg.KeyExists('.'+typ) then begin
      Result := std;
      FreeAndNil(reg);
      exit;
    end;

    if not Reg.OpenKey('\.'+typ,false) then begin
      Result := std;
      FreeAndNil(reg);
      exit;
    end;

    if reg.ReadString('(Standard)') = '' then begin
      Result := std;
      FreeAndNil(reg);
      exit;
    end else begin
      Result := reg.ReadString('(Standard)');
      FreeAndNil(reg);
      exit;
    end;

  except
    Result := std;
    if reg <> nil then
      FreeAndNil(reg);
  end;

end;
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.07.02 14:53 
Weil es (Standard) in diesem Sinn nicht gibt! Du müsstest einfach einen Leerstring übergeben:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
function TFrmMain.GetFileType(Typ : String) : String; 
var
  reg : TRegistry; 
  std : String; 
begin
  // Standardrückgabe
  Result := 'Unbekannter Typ';

  // falls erforderlich, Punkt ergänzen
  if(Typ[1] <> '.') then
    Typ  := '.' + Typ;

  reg := TRegistry.Create;
  with reg do
    try 
      RootKey := HKEY_CLASSES_ROOT;
      if(OpenKey(Typ,false)) then
        begin
          std := ReadString('');
          CloseKey;

          if(std <> '') then
            if(OpenKey(std,false)) then
              begin
                std := ReadString('');
                CloseKey;
                if(std <> '') then
                  Result := std;
              end;
        end;
    finally
      Free;
    end;
end;
knightkiller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

WinXP SP2
D7 Pers, D2005 Pers
BeitragVerfasst: Fr 19.07.02 15:20 
voll geil jetzt funktionierts! :D vielen Dank!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.07.02 17:31 
Vielleicht solltest du noch folgendes bedenken (hab´ ich vorhin leider vergessen):

Standardmäßig wird die Registry mit "KEY_ALL_ACCESS" geöffnet. Das schließt Lese- und Schreibrechte ein. Und genau das kann auf NT-Systemen zu Problemen führen, denn HKEY_CLASSES_ROOT ist auch einer von den Schlüsseln, auf die nicht jeder Benutzer vollen Zugriff hat.
Selbst wenn du kein NT, 2000 oder XP hast - vielleicht benutzt es ein anderer auf so einem System. Und wenn derjenige dann noch eingeschränkte Rechte hat und kein Admin ist, sieht er immer nur "Unbekannter Dateityp" als Ergebnis und wird entsprechend "sauer" sein.

Lösung - Du öffnest die Registry so:
ausblenden Quelltext
1:
reg := TRegistry.Create(KEY_QUERY_VALUE);					

Dann klappt´s auch mit weniger Benutzerrechten, und das Programm zeigt ordnungsgemäß die Beschreibung an.

Mathias.