AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Win7 64Bit und Dateiendungverknüpfung von XP
Thema durchsuchen
Ansicht
Themen-Optionen

Win7 64Bit und Dateiendungverknüpfung von XP

Ein Thema von martinf16 · begonnen am 18. Apr 2010 · letzter Beitrag vom 18. Apr 2010
Antwort Antwort
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#1

Win7 64Bit und Dateiendungverknüpfung von XP

  Alt 18. Apr 2010, 11:48
Um mein Programm im Kontextmenü aller Dateien anzuzeigen, benutze ich folgenden Code:


Delphi-Quellcode:
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;
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:

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?
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Win7 64Bit und Dateiendungverknüpfung von XP

  Alt 18. Apr 2010, 12:59
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.
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
103 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Win7 64Bit und Dateiendungverknüpfung von XP

  Alt 18. Apr 2010, 13:03
Hallo Martin,

versuche mal folgendes:

Delphi-Quellcode:
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;
...
Besser noch in Verbindung mit einem vorherigen Aufruf von IsWow64Process() aus kernel32.dll:

Delphi-Quellcode:
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;
Dennoch bleibt die Erfordernis, Deine Anwendung mit Admin-Rechten auszuführen, damit Deine Änderungen in der Registry gespeichert werden können.

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
Achim
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Win7 64Bit und Dateiendungverknüpfung von XP

  Alt 18. Apr 2010, 13:53
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?
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Win7 64Bit und Dateiendungverknüpfung von XP

  Alt 18. Apr 2010, 16:06
Das kann doch irgendwie nicht sein.. Meine weiteren Tests haben folgendes ergeben:
  • Eintrag Folder\shell\Prog aktivieren: Geht unter Win7 64 mit API Call, aber nicht mit TRegistry.
  • Eintrag Folder\shell\Prog entfernen: Geht unter Win7 64 nicht mit API Call, dafür aber mit TRegistry.
  • Eintrag *\shell\Prog aktivieren: Geht unter Win7 64 weder mit API Call noch mit TRegistry. -> Geht mit Kombination aus beidem.
  • Eintrag *\shell\Prog entfernen: Geht unter Win7 64 nicht mit API Call, dafür aber mit TRegistry.

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??
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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