Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Dateiendung registrieren - Problem (https://www.delphipraxis.net/184423-dateiendung-registrieren-problem.html)

dGeek 25. Mär 2015 14:51

Dateiendung registrieren - Problem
 
Eigentlich habe ich das schon oft gemacht, nur komischerweise funktioniert jetzt etwas nicht mehr.

Die Dateiendung wird korrekt registriert, aber wenn ich eine Datei mit Endung "XYZ" schließlich doppelklicke, wird kein Parameter übergeben (%1).
ParamCount ist immer 1 und nicht, wie erwünscht, 2.


Ich nutze folgenden Code von Meflin.
Delphi-Quellcode:
function InstallExt(Extension, ExtDescription, FileDescription, OpenWith, ParamString: string; IconIndex: Integer;
  ExtVerb: string = 'Open'): Boolean;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    with Reg do
    begin
      RootKey := HKEY_CLASSES_ROOT;
      OpenKey(Extension, True);
      WriteString('', ExtDescription);
      OpenKey('\' + ExtDescription, True);
      WriteString('', FileDescription);
      OpenKey('DefaultIcon', True);
      WriteString('', OpenWith + ',' + IntToStr(IconIndex));
      OpenKey('\' + ExtDescription + '\Shell\' + ExtVerb + '\Command', True);
      WriteString('', '"' + OpenWith + '" "' + ParamString + '"');
    end;
    Result := True;
  except
    Result := False;
  end;
  Reg.Free;
end;

DeddyH 25. Mär 2015 15:38

AW: Dateiendung registrieren - Problem
 
Wenn ParamCount 1 ist, wurde doch ein Parameter übergeben.

[edit] Übrigens ist der Code nicht so sonderlich. Zumindest sollte man einen Ressourcenschutzblock (try - finally) einbauen, ggf. mal die Rückgabewerte von OpenKey auswerten und je OpenKey ein CloseKey aufrufen.

Wie sieht es denn hiermit aus? http://delphi.about.com/cs/adptips20...ltip0801_3.htm [/edit]

dGeek 25. Mär 2015 18:39

AW: Dateiendung registrieren - Problem
 
Ups da habe ich mich vertippt. Ich meinte natürlich 0.

Mit dem Code von about selbes Ergebnis.

Vielleicht liegt es an der VM?

DeddyH 25. Mär 2015 18:42

AW: Dateiendung registrieren - Problem
 
Hast Du denn auch administrative Rechte?

dGeek 25. Mär 2015 18:47

AW: Dateiendung registrieren - Problem
 
Die habe ich, ja.
Sowohl ich als Windows-Benutzer als auch die Anwendung selber.

DeddyH 25. Mär 2015 19:06

AW: Dateiendung registrieren - Problem
 
Ich hab das mal im Editor umgeschrieben, das ist zwar nicht sonderlich elegant, aber versuch doch mal
Delphi-Quellcode:
type
  ERegException = class(Exception);

procedure InstallExt(Extension, ExtDescription, FileDescription, OpenWith, ParamString: string; IconIndex: Integer;
  ExtVerb: string = 'open');
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if Reg.OpenKey(Extension, True) then
      try
        Reg.WriteString('', ExtDescription);
      finally
        Reg.CloseKey;
      end
    else
      raise ERegException.CreateFmt('Schlüssel HKEY_CLASSES_ROOT\%s konnte nicht geöffnet/angelegt werden.', [ExtDescription]);
    if Reg.OpenKey(ExtDescription, True) then
      try
        Reg.WriteString('', FileDescription);
        if Reg.OpenKey('DefaultIcon', True) then
          try
            Reg.WriteString('', OpenWith + ',' + IntToStr(IconIndex));
          finally
            Reg.CloseKey;
          end
        else
          raise ERegException.CreateFmt('Schlüssel HKEY_CLASSES_ROOT\%s konnte nicht geöffnet/angelegt werden.', [FileDescription + '\DefaultIcon']);
        if Reg.OpenKey('Shell\' + ExtVerb + '\Command', True) then
          try
            Reg.WriteString('', '"' + OpenWith + '" "' + ParamString + '"');
          finally
          end
        else
          raise ERegException.CreateFmt('Schlüssel HKEY_CLASSES_ROOT\%s konnte nicht geöffnet/angelegt werden.', [ExtDescription + '\Shell\' + ExtVerb + '\Command']);
      finally
        Reg.CloseKey;
      end
    else
      raise ERegException.CreateFmt('Schlüssel HKEY_CLASSES_ROOT\%s konnte nicht geöffnet/angelegt werden.', [FileDescription]);
  finally
    Reg.Free;
  end;
end;
Ist zwar ungetestet, sollte aber zumindest den Grund nennen, wieso es nicht klappt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz