Forum: PC-Programmierung Lesen der Registry klappt bei Win2008Server nicht mehr;


von interrupt (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von interrupt (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

interrupt schrieb:
> Dann würde ich die Daten zukünftig einfach dort eintragen.

es gibt auch richtlinine wo man seine daten abzulegen hat!

von interrupt (Gast)


Lesenswert?

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 ?

von Peter II (Gast)


Lesenswert?

interrupt schrieb:
> wenn es sich um einen Service handelt ?

woher sollten wir wissen das es sich um ein Service handelt?

von oszi40 (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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

von interrupt (Gast)


Lesenswert?

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 ?

von Robert L. (lrlr)


Lesenswert?

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...

?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.