Win7 64Bit und Dateiendungverknüpfung von XP
Um mein Programm im Kontextmenü aller Dateien anzuzeigen, benutze ich folgenden Code:
Delphi-Quellcode:
Unter Windows XP läuft das auch alles wunderbar, bei einem Test unter Windows 7, 64 Bit ging gar nichts mehr. Mein erster Gedanke waren die Adminrechte, aber auch mit Adminrechten geht es nicht. Ich nehme an, es liegt an dem 64 Bit System, da sich hier nach einigen Recherchen ja einiges geändert haben soll. Ich habe mir diverse Seiten angesehen, wie zum Beispiel:
procedure TForm1.addClick(Sender: TObject);
var Reg:TRegistry; begin reg:=tregistry.create(); Reg.RootKey:=HKEY_CLASSES_ROOT; Reg.OpenKey('*\shell\'+Name,true); Reg.WriteString('',Title);//optional Reg.CloseKey; Reg.OpenKey('*\shell\'+Name+'\command',true); Reg.WriteString('',Adress); // adress="c:\test\meinprogramm.exe %1" Reg.CloseKey; reg.free; end; http://msdn.microsoft.com/en-us/library/aa384253.aspx aber trotzdem bin ich nicht auf eine Lösung gekommen. Ich denke das Problem interessiert viele, die Ihre alten Anwendung auch unter Windows 7 64 Bit läuffähig halten möchten.. Vielleicht kennt jemand eine Lösung, was geändert werden muss? |
Re: Win7 64Bit und Dateiendungverknüpfung von XP
Ich habe inzwischen den Schlüssel in der Win7 64 Bit Registry manuell eingefügt und alles funktioniert, wie es soll. Die Frage ist nur, wie man das Programm dazu bekommt, diesen Schlüssel auch selber anzulegen.
Bei mir erscheint immer bloß die Fehlermeldung "Failed to set data for ''". Ich habe auch schon folgendes Thema gefunden: http://www.delphipraxis.net/internal...t.php?t=103720 Hier geht es um die Umleitung auf Wow6432Node, aber auch eine deaktivierung dieses Knotens lässt mich nicht in die Registry schreiben. |
Re: Win7 64Bit und Dateiendungverknüpfung von XP
Hallo Martin,
versuche mal folgendes:
Delphi-Quellcode:
Besser noch in Verbindung mit einem vorherigen Aufruf von IsWow64Process() aus kernel32.dll:
const
KEY_WOW64_64KEY = $0100; KEY_WOW64_32KEY = $0200; procedure TForm1.addClick(Sender: TObject); var Reg:TRegistry; begin reg:=tregistry.create(KEY_WOW64_64KEY); // Zugriff auf den 64-Bit-Teil der Registry Reg.RootKey:=HKEY_CLASSES_ROOT; ...
Delphi-Quellcode:
Dennoch bleibt die Erfordernis, Deine Anwendung mit Admin-Rechten auszuführen, damit Deine Änderungen in der Registry gespeichert werden können.
function IsWow64: Boolean;
type TIsWow64Process = function( // Type of IsWow64Process API fn Handle: Windows.THandle; var Res: Windows.BOOL ): Windows.BOOL; stdcall; var IsWow64Result: Windows.BOOL; // Result from IsWow64Process IsWow64Process: TIsWow64Process; // IsWow64Process fn reference begin // Try to load required function from kernel32 IsWow64Process := Windows.GetProcAddress(Windows.GetModuleHandle('kernel32'), 'IsWow64Process'); if Assigned(IsWow64Process) then begin // Function is implemented: call it if not IsWow64Process(Windows.GetCurrentProcess, IsWow64Result) then raise Exception.Create('IsWow64: bad process handle'); Result := IsWow64Result; // Return result of function end else // Function not implemented: can't be running on Wow64 Result := False; end; Meine Empfehlung: Verlagere die Registrierung Deiner Anwendung in das Setup-Programm (z.B. Inno Setup; http://www.jrsoftware.org/isinfo.php) Oder teste in Deinem Programm, ob Änderungen in der Registry erforderlich sind. Im Bedarfsfall starte die Anwendung erneut mit Admin-Rechten (via ShellExecute(nil, 'runas', ...)) und beende die laufende Instanz. HTH Achim |
Re: Win7 64Bit und Dateiendungverknüpfung von XP
Okay... Vielen Dank schon mal.
Obwohl das alles sehr vielversprechend aussieht, funktioniert es trotzdem nicht auf Anhieb. Auch mit Adminrechten kommt immer noch die Melung "Failed to set data for ''". Der Key wird zwar angelegt, aber das Programm schafft es nicht darin zu schreiben. Testweise habe ich das Programm im XP Kompatibilitäts-Modus ausgeführt und damit geht alles einwandfrei und alle Keys und Schlüssel können angelegt werden. Aber das sollte doch auch gehen ohne den Kompatibiltäts Modus, oder?? Das mit dem als Admin öffnen hört sich gut an.. Reicht es dazu aus, die eigene EXE mit dem Parameter runas zu starten statt open?? Edit: Testweise habe ich statt der oben genannten Funktion die Einträge in der Registry mit den WinApi Aufrufen RegCreateEx, RefSetValueEx und so weiter vorgenommen und damit kommt es nicht mehr zu dem Fehler.. Vor allem scheint man bei diesen Anrufen nicht mehr die Unterscheidung zwischen 32 und 64 Bit zu brauchen. Kann das sein??? Oder können jetzt andere Probleme auftauchen, die ich bei meinen Tests unter Win7 64bit und WinXP 32bit noch nicht sehe? |
Re: Win7 64Bit und Dateiendungverknüpfung von XP
Das kann doch irgendwie nicht sein.. Meine weiteren Tests haben folgendes ergeben:
Unter Win XP 32 funktionieren in allen Fällen sowohl API Call als auch die Variante mit TRegistry. Gibt es vielleicht noch eine dritte Variante, vielleicht bekomme ich damit die Registrierung von * hin?? EDIT: Es wird noch kurioser.. Die Verknüpfung mit * habe ich inzwischen durch probieren auch hinbekommen: Mit der API Funktion RegCreateKeyEx wird ein Key mit der Option KEY_WOW_64KEY erstellt und in diesem dann mit TRegistry geschrieben. Das funktioniert offenbar nur wenn der Flag, den Key gegebenenfalls neu zu erstellen bei OpenKey auf false steht. Das würde auch erklären wieso das Löschen immer funktioniert, nicht aber das erstellen. Denn beim Löschen habe ich ja den Wert auf false gehabt. Aber ist das nicht alles ein bisschen komisch?! ZUSATZFRAGE: Ich öffne RegCreateKeyEx mit KEY_WOW_64KEY und benutze TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW_64KEY). Das funktioniert auch unter 32 bit XP. Sollte ich trotzdem vorher abfragen ob es sich um Win64 handelt oder ist das egal, schließlich funktioniert es ja trotzdem.. Oder kann das zu Problemen führen?? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 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