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/)
-   -   Delphi Verknüpfung einer Dateiendung aktualisieren (https://www.delphipraxis.net/105632-verknuepfung-einer-dateiendung-aktualisieren.html)

MrKnogge 26. Dez 2007 16:25


Verknüpfung einer Dateiendung aktualisieren
 
Moin,

mit folgenden zwei Funktionen verknüpfe ich eine Dateiendung mit meinem Programm, bzw. lösche diese Verknüpfung:

Delphi-Quellcode:
function InstallExt(Extension, ExtDescription, FileDescription,
OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  if Extension <> '' then
  begin
    if Extension[1] <> '.' then
      Extension := '.' + Extension;

    Reg := TRegistry.Create;
    try
      Reg.RootKey := HKEY_CLASSES_ROOT;
      if Reg.OpenKey(Extension, True) then
      begin
       Reg.WriteString('', ExtDescription);
       if Reg.OpenKey('\' + ExtDescription, True) then
       begin
         Reg.WriteString('', FileDescription);
         if Reg.OpenKey('DefaultIcon', True) then
         begin
           Reg.WriteString('', Format('%s,%d', [OpenWith, IconIndex]));
           if Reg.OpenKey('\' + ExtDescription + '\Shell\Open\Command', True) then
           begin
             Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString]));
             Result:=True;
           end;
         end;
       end;
     end;
  finally
    Reg.Free;
  end;
  end;
end;

function UnInstallExt(Extension: String): Boolean;
var
  Reg: TRegistry;
  Description: String;
begin
  Result := False;
  if Extension <> '' then
    begin
    if Extension[1] <> '.' then
      Extension := '.' + Extension;
    Reg := TRegistry.Create;
    try
      Reg.RootKey := HKEY_CLASSES_ROOT;
      if Reg.KeyExists(Extension) then
        begin
        Reg.OpenKey(Extension, false);
        Description:=Reg.ReadString('');
        Reg.CloseKey;
        if Reg.KeyExists('\'+Description) then
          Result:=Reg.DeleteKey(Extension) and Reg.DeleteKey('\' + Description);
        end;
    finally
      Reg.Free;
    end;
  end;
end;
Wenn ich nun, eine Verknüpfung lösche und direkt wieder neu erstelle (mit anderem Icon und anderer Beschreibung) oder die Verknüpfung nur lösche.
So funktioniert zwar die Verknüpfung wie sie es soll (oder eben nicht), aber die Dateien haben immernoch das alte Icon und die entsprechende Beschreibung,
diese wird erst nach einem Neustart des Systems aktualisiert.

Gibt es einen Api-Befehl um Windows zu veranlassen dies direkt zu aktualisieren ?

Gruß

Apollonius 26. Dez 2007 16:34

Re: Verknüpfung einer Dateiendung aktualisieren
 
ShChangeNotify ist das Stichwort. Mit der Forensuche erhält man Folgendes:
Delphi-Quellcode:
ShChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil)

Christian Seehase 26. Dez 2007 16:48

Re: Verknüpfung einer Dateiendung aktualisieren
 
Moin Christian,

die Struktur solltest Du aber noch mal überdenken.
TRegistry.Free führt zwar auch einen CloseKey aus, aber die Betonung liegt hier auf einen ;-).
Alle anderen bleiben geöffnet, bis das Programm wieder geschlossen wird.

MrKnogge 26. Dez 2007 17:11

Re: Verknüpfung einer Dateiendung aktualisieren
 
Danke ShChangeNotify war genau was ich gesucht habe und funktioniert wunderbar.

@Christian
Danke für den Hinweis, ich hab den Code vorhin mal kurz blind übernommen. Wusste allerdings auch nicht, dass Free nicht alle schließt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 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