TRegistry + Windows10 Bug?



  • Hallo,

    folgender Code funktioniert nicht mehr unter Windows 10 (64bit)

    Die Anwendung ist als 32bit kompiliert und wird mit Administrator-Rechten ausgeführt, es wird zwar unter "HKEY_LOCAL_MACHINE" kein Schlüssel "Software\\MyCompanyName\\MyApplication" angelegt, dafür wird dieser bei Windows 10 unter HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\MyCompanyName\\MyApplication angelegt, aber Werte in die Registry-Schreiben endet mit einer Exception...

    Hier der Beispielcode:

    void __fastcall TForm2::InsertToRegBtnClick(TObject *Sender)
    {
    	TRegistry* reg = new TRegistry(KEY_READ);
    	reg->RootKey = HKEY_LOCAL_MACHINE;
    
    	if(!reg->KeyExists("Software\\MyCompanyName\\MyApplication\\"))
    	{
    		MessageDlg("Key not found! Created now.",
    					mtInformation, TMsgDlgButtons() << mbOK, 0);
    	}
    	reg->Access = KEY_WRITE;
    	bool openResult = reg->OpenKey("Software\\MyCompanyName\\MyApplication\\", true);
    
    	if(!openResult)
    	{
    		MessageDlg("Unable to create key! Exiting.",
    					mtError, TMsgDlgButtons() << mbOK, 0);
    		return;
    	}
    	//Checking if the values exist and inserting when neccesary
    
    	if(!reg->KeyExists("Creation\ Date"))
    	{
    		TDateTime today = TDateTime::CurrentDateTime();
    		reg->WriteDateTime("Creation\ Date", today);
    	}
    
    	if(!reg->KeyExists("Licenced\ To"))
    	{
    		reg->WriteString("Licenced\ To", "MySurname\ MyFirstName");
    	}
    
    	if(!reg->KeyExists("App\ Location"))
    	{
    		reg->WriteExpandString("App\ Location",
    								"%PROGRAMFILES%\\MyCompanyName\\MyApplication\\");
    	}
    
    	if(!reg->KeyExists("Projects\ Location"))
    	{
    		reg->WriteExpandString("Projects\ Location",
    								"%USERPROFILE%\\MyApplication\\Projects\\");
    	}
    
    	reg->CloseKey();
    	reg->Free();
    }
    

    vielleicht hat ja jemand eine Idee, außer die Windows API...

    Grüßé,
    Sany



  • Unter Win 64bit werden diverse virtualisierungen und Umleitungen von Zugriffen auf Dateien, Registry etc. für 32bit Anwendungen vorgenommen. Schau dir mal das an: https://msdn.microsoft.com/de-de/library/windows/desktop/aa384235



  • Und wie lässt sich das Problem mit der TRegistry Komponente übergehen ohne auf die WinAPI zu greifen zu müssen? Ich mein klar, funktioniert... aber dennoch, wäre es interessant, in dem Beitrag steht ja auch nur, das die 32 Bit Applikationen von den 64 Bit isoliert werden.

    Aber warum funktioniert es dann nicht mehr? Genau wegen diesem Mapping? Weil der Key wird ja erstellt, nur nich der inhalt...



  • Du musst im Konstruktor von TRegistry noch einen zusätzlichen Wert mit übergeben. Siehe auch hier:

    https://msdn.microsoft.com/de-de/library/windows/desktop/aa384129(v=vs.85).aspx

    als Beispiel:

    TRegistry* reg = new TRegistry(KEY_READ | KEY_WOW64_64KEY);
    


  • Herzlichen Dank, genau das war das was ich gesucht habe 🙂

    Sollte man evtl. mit in die FAQs aufnehmen, denn so per Google findet man nicht unbedingt etwas, wenn man nicht direkt auf die 64bit/32bit umsetzung kommt.

    Grüße,
    daniel



  • Gern geschehen.
    Noch ein Hinweis:

    Die Methode "OpenKeyReadOnly" von TRegistry darfst du dann nicht mehr benutzen, weil sie die Zugriffsmethode auf KEY_READ zurückstellt. Stattdessen dann OpenKey mit CanCreate=false benutzen.

    Siehe auch hier:
    http://docwiki.embarcadero.com/Libraries/Seattle/de/System.Win.Registry.TRegistry.OpenKeyReadOnly


Log in to reply