Hallo, ich habe hier ein Programm, das am Anfang programmspezifische Einstellungen aus der Registry liest, was bei Windows 2008 Server nicht mehr funktioniert. Unter XP funktioniert das Programm einwandfrei. Hier der entsprechende Ausschnitt : int rck; rck = (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_READ, &keyopenhandle)==ERROR_SUCCESS); if (rck) { ... hier erfolgt das Lesen und die Auswertung der Registry-Einträge, aber hierher kommt das Programm bei W2008Server nicht, also ist rck==0 } Der Wert für "subkey" ist "SOFTWARE\????_????\????" (? : programmspezifische Namen) Vor dem Start des Programmes wird eine *.reg-datei aufgerufen, die benötigten Daten stehe also sicher in der Registry
wenn es ein 64bit system ist dann wird der eintrag im 64bit teil angelegt. Wenn du mit einem 32bit system abfragst landest du in einem anderen Teil der regitry und dort ist dein Eintrag vermutlich nicht da.
interrupt schrieb: > Vor dem Start des Programmes wird eine *.reg-datei aufgerufen, die > benötigten Daten stehe also sicher in der Registry Das tun sie vermutlich, nur woanders als Du denkst. Registry-Zugriffe von 32-Bit-Prozessen werden aus "Kompatibilitätsgründen" in andere Bereiche der Registry umgelenkt; dein Registry-Import per *.reg-Datei weiß aber davon nichts. http://msdn.microsoft.com/en-us/library/windows/desktop/aa384232%28v=vs.85%29.aspx
Schon seltsam, bei einam anderen 32-Bit CPP-Programm (ebenfalls kompiliert mit Gnu CPP) funktioniert das Lesen der Registry mit diesem Codefragement einwandfrei : sprintf(subkey,"SYSTEM\\CurrentControlSet\\Service\\%s\\Daten",SERVICE_N AME); rck = (RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&keyopenhandle)==ERRO R_SUCCESS); Danke für die Hinweise, ich werde mal nachsehen, wo die Daten in der Registry tatsächlich stehen. Gilt der "Kompatibilitätsmodus" für Einträge unter "SYSTEM\\CurrentControlSet\\Service\\..." nicht ? Dann würde ich die Daten zukünftig einfach dort eintragen.
interrupt schrieb: > Dann würde ich die Daten zukünftig einfach dort eintragen. es gibt auch richtlinine wo man seine daten abzulegen hat!
interrupt schrieb: > sprintf(subkey,"SYSTEM\\CurrentControlSet\\Service\\%s\\Daten",SERVICE_N > AME); Entspricht "sprintf(subkey,"SYSTEM\\CurrentControlSet\\Service\\%s\\Daten",SERVICE_ N AME);" nicht den "Richtlinien", wenn es sich um einen Service handelt ?
interrupt schrieb: > wenn es sich um einen Service handelt ? woher sollten wir wissen das es sich um ein Service handelt?
1.>Unter XP funktioniert das Programm einwandfrei. Welcher User? 2.Ob die Rechte stimmen? 2008:Admin ist nicht immer Admin. 3.Ob was versteckt ist?
Rufus Τ. Firefly schrieb: > Das tun sie vermutlich, nur woanders als Du denkst. Registry-Zugriffe > von 32-Bit-Prozessen werden aus "Kompatibilitätsgründen" in andere > Bereiche der Registry umgelenkt; dein Registry-Import per *.reg-Datei > weiß aber davon nichts. Ich habe mich da etwas missverständlich ausgedrückt. Die Daten stehen dort, wo sie stehen sollen, aber das Programm liest sie nicht von dort, sondern aus einem umgelenkten Registryzweig. > sprintf(subkey,"SYSTEM\\CurrentControlSet\\Service\\%s\\Daten",SERVICE_N AME);" aber geht ziemlich sicher schief, da der Zweig korrekt HKLM\SYSTEM\CurrentControlSet\Services\ ... heißt -- also Services mit "s" am Ende.
Rufus Τ. Firefly schrieb: > ch habe mich da etwas missverständlich ausgedrückt. Die Daten stehen > dort, wo sie stehen sollen, aber das Programm liest sie nicht von dort, > sondern aus einem umgelenkten Registryzweig. dann stehen sie also dort wie sie nicht stehen sollen. Importiere die daten mal mit %systemroot%\syswow64\regedit http://support.microsoft.com/kb/305097
Es ist tatsächlich so, dass dieser Registry-Pfad sprintf(subkey, "SYSTEM\\CurrentControlSet\\Services\\????\\Daten"); jetzt auch mit der 32-Bit-Anwendung im 64Bit-OS (Windows 2008 Server) direkt funktioniert. (???? steht für den tatsächlichen Dienstnamen) Eine Frage an die Experten : Welchen "virtuellen" Pfad müsste man im "Kompatbilitätsmodus" angeben, wenn man den ursprünglichen Registry-Pfad sprintf(subkey, "SOFTWARE\\SWIS_REGIO\\????"); weiter benutzen wollte ? Ausserdem müsste man dann ja noch eine Fallunterscheidung (32/64 Bit-Betriebssystem) in das Programm einbauen, welche Systemvariable bzw. andere Methode würde man dafür am besten verwenden ?
dein Problem ist ja eher das:
>Vor dem Start des Programmes wird eine *.reg-datei
die .reg datei, wird sich wie ein 64bit programm verhalten..
besser wäre also, (d)ein 32bit Programm schreibt die reg-einträge
selber...
?!
interrupt schrieb: > Welchen "virtuellen" Pfad müsste man im "Kompatbilitätsmodus" angeben ... Lies Dir doch mal den von mir verlinkten MSDN-Artikel über den "Registry Redirector" durch.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.