Fehler beim Registryschreiben in WinXP

hoi,

also ich hab ein Programm geschrieben, welches Registriewerte ausliest und einschreibt, funktioniert unter WinME (da hab ichs programmiert) auch wunderbar nur unter WinXp nicht…

bei Xp hatt ich zuerst das problem das folgende 3 Dateien gefehlt haben:

MFC42D.dll
MFCO42D.dll
MSVCRTD.dll

ausm winMe systemordner ins programmverzeichniss kopiert und dann gings (also in WinXP)

auch das auslesen der werte ging problemlos (werte waren auch korrekt)

jedoch als die Werte wieder in die Registry geschrieben wurden, gingen nurnoch die DWORD´s korrekt.
Die Zeichenfolgen bleiben einfach leer… (also komplett leer, nichtmal „“ wird angezeigt)

hier mal ein beispiel wie ich die Werte in die registry schreibe:

 values[44] = reinterpret\_cast(value5);  
 RegSetValueEx(openkeys[24], getvalues[44], NULL, REG\_SZ, values[44], NULL);  

thx für hilfe :smile:

Hallo!

Das Problem mit den Fehlenden DLL’s kommt daher dass du das Programm nicht richtig gelinkt hast.
Dur kannst bein Linken angeben od du statisch oder dynamisch binden willst.
Je nach dem brauchst du dann die DLL’s oder nicht (im letzteren Fall wird die EXE grösser, weil der Funktionscode zum EXE gelinkt wird.

Nun zu deinem Code:

values[44] = reinterpret\_cast(value5);  
> RegSetValueEx(openkeys[24], getvalues[44], NULL, REG\_SZ,  
> values[44], NULL);  

Wenn man nicht weiss welche parameter du übergibst kann man nur raten wo das problem liegt.

beim letzten parameter sagt die MSDN:
cbData
[in] Specifies the size of the information pointed to by the lpData parameter, in bytes. If the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters.

Dieser Parameter ist bei dur NULL!

Jedenfalls sagt die MSDN auch:

If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.

Das würd ich an deiner Stelle auch mal tun :smile:

Gruß Pauli!

Hallo!

Das Problem mit den Fehlenden DLL’s kommt daher dass du das
Programm nicht richtig gelinkt hast.
Dur kannst bein Linken angeben od du statisch oder dynamisch
binden willst.
Je nach dem brauchst du dann die DLL’s oder nicht (im
letzteren Fall wird die EXE grösser, weil der Funktionscode
zum EXE gelinkt wird.

hm und wie kann ich das einstellen? :smile:
also das linken?

Nun zu deinem Code:

values[44] = reinterpret\_cast(value5);  
> > RegSetValueEx(openkeys[24], getvalues[44], NULL, REG\_SZ,  
> > values[44], NULL);  

Wenn man nicht weiss welche parameter du übergibst kann man
nur raten wo das problem liegt.

beim letzten parameter sagt die MSDN:
cbData
[in] Specifies the size of the information pointed to by the
lpData parameter, in bytes. If the data is of type REG_SZ,
REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size
of the terminating null character or characters.

Dieser Parameter ist bei dur NULL!

Jedenfalls sagt die MSDN auch:

If the function fails, the return value is a nonzero error
code defined in Winerror.h. You can use the FormatMessage
function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a
generic description of the error.

Das würd ich an deiner Stelle auch mal tun :smile:

Gruß Pauli!

erstma thx für die antwort :smile:

hm du meinst das liegt daran, das ich die größe nicht angebe?
nur komisch dasses bei WinMe auch ohne geht…

muss ich mal probieren…

und das mit dem error hab ich bisher noch nie gebraucht :wink: aber ich kanns ja mal versuchen.

Hallo Fragewurm,

und das mit dem error hab ich bisher noch nie gebraucht :wink:
aber ich kanns ja mal versuchen.

Wenn alles problemlos funktioniert brauchst du es auch nicht, aber wenn mal was schief geht, hast du wenigstens einen Anhaltspunkt was schief gelaufen ist, bzw. du kannst Programmtechnisch darauf reagieren.

Ich nehme an, dass du nicht sehr begeisterst sein wirst, wenn beim Speichern deiner Arbeit, ein Programm einfach so tut als sei alles in ordnung oder einfach abstürzt, nur weil du z.B. ein falsches Laufwerk angeklickt hast, deshalb sollte man die Fehlermeldungen immer auswerten und nicht einfach davon ausgehen, dass es schon gut gegangen ist.

MfG Peter(TOO)

hoi,

also ich hab ein Programm geschrieben, welches Registriewerte
ausliest und einschreibt, funktioniert unter WinME (da hab
ichs programmiert) auch wunderbar nur unter WinXp nicht…

bei Xp hatt ich zuerst das problem das folgende 3 Dateien
gefehlt haben:

MFC42D.dll
MFCO42D.dll
MSVCRTD.dll

ausm winMe systemordner ins programmverzeichniss kopiert und
dann gings (also in WinXP)

Hoi zurück!

(klingt nach südlich des Brenners)

All diese DLLs werden nur dann benötigt, wenn Du die Debug-Version Deiner Anwendung zum Laufen bringen willst. Die von Dir beschriebene Lösung ist für Tests auf dem Entwicklungsrechner sicher korrekt, allerdings sind diese DLLs nicht „redistributable“, das heißt, sie dürfen mit einem für die Öffentlichkeit bestimmten Programm nicht verteilt werden. (suche dazu einfach auf Deinem Entwicklungsrechner nachd er Datei „redist.txt“, welche alle wiederverteilbaren MS-Dateien auflistet).

Die Arbeitsversion Deiners Programms sollte immer ein Release-Build („Build/Set Active Configuration…“) sein, der dann auch die Release-Versionen obiger DLLs verwendet und damit auch mit XP zurechtkommt.

Zu Deinem 2. Problem sollte die Lösung bereits geliefert sein!

Grüße Safog

falsch
Hallo!

Ob statisch oder dynamisch gelinkt wird, hängt nicht von debug oder release version ab.
Man kann es für debug und release getrennt einstellen.
das geht so:
project property page aufrufen.
unter ‚configuration porperties‘ gibt es den punkt ‚general‘.
dort gibt es dann ‚use of mfc‘ und da kannst du dann ‚Use MFC in a Static Library‘ oder ‚Use MFC in a Shared DLL‘ einstellen.

Gruß Pauli!

thx aber nach einigem suchen, hatt ich das gestern auch schon gefunden :wink:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

ich bin nen Fragewurm? :smiley:

naja also ich hab fehlermeldungen bisher immer mitm debug lösen können :smile:

und mal so gesagt, ich hab bisher nur eine handvoll tutorials gemacht und ein programm zum starten anderer (vordefinierter) :wink:

mein aktuelles programm is mein ersted richtiges Programm welches auch funktioniert :smiley:

btw: ich hab das Problem teilweise lösen können, hab einfach

values[1] = reinterpret_cast(value5);
RegSetValueEx(openkeys[1], getvalues[1], NULL, REG_SZ, values[1], NULL);

aus der NULL am ende folgendes gemacht:

sizeof(values[1]))
(die zahl dann für den jeweiligen wert)

da hatt ich übrigens auch schon bei den DWORD´s drin, drum hatten die auch gleich unter XP funktioniert 8[

aber jetzt hab ich noch das prob, das die länge nicht stimmt, z.b. kommt bei dem String „German“ nur „Germ“ raus…

ich hatt noch keine Zeit das ausgiebiger zu testen, aber ich schätze mal die größe wird bei den Strings immer mit 4 Byte angegeben…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Pauli!

Mir ist nicht ganz klar, was an meiner Aussage falsch sein soll.
Ich habe nur gesagt, dass das Problem mit den fehlenden DLLs nicht aufgetreten wäre, wenn eine Release-Version der Anwendung zum Einsatz
gekommen wäre. Alle fehlenden DLLs sind nämlich inder Release-Version Bestandteil jeder XP-Installation und damit auf einem vollständig installierten System vorhanden. Also besteht absolut keine Notwendigkeit, eine Anwendung mit eine statisch gelinkten MFC-Moloch aufzublasen.
Ganz offensichtlicherweise hatte sein Projekt niemals statisch gelinkte MFC-DLLs im Einsatz, was auch gut so ist.

Grüße Safog

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Fragewurm,

ich bin nen Fragewurm? :smiley:

Näheres dazu findest du in meiner ViKa :stuck_out_tongue:

naja also ich hab fehlermeldungen bisher immer mitm debug
lösen können :smile:

Richtig Stimmung gibt es erst, wenn du mit Zeigern arbeitest und dann statt eines Zeigers, einen Fehlercode als Zeiger verwendest :wink:))

mein aktuelles programm is mein ersted richtiges Programm
welches auch funktioniert :smiley:

sagen wir mal fast funktioniert :smile:)

btw: ich hab das Problem teilweise lösen können, hab einfach

values[1] = reinterpret_cast(value5);
RegSetValueEx(openkeys[1], getvalues[1], NULL, REG_SZ,
values[1] , NULL);

aus der NULL am ende folgendes gemacht:

sizeof( get values[1])) ???
(die zahl dann für den jeweiligen wert)

Der letze Parameter dient dazu Pufferüberläufe zu verhindern.

sizeof() liefert dir die anzahl Bytes, welche im Speicher reserviert werden und schon zur Compilierzeit bekannt sind.
values[1] belegt 4 Bytes, da du aber die Deklaration von values[] nicht angiebst kann ich dazu nicht viel mehr sagen…

Du müsstest strlen(values[1]) verwenden, welches dan die Anzahl Bytes welche der String tatsächlich belegt liefert. Da strlen() das Nullzeichen am Ende nicht mitzählt musst du noch +1 anhängen.

MfG Peter(TOO)

ich bin nen Fragewurm? :smiley:

naja also ich hab fehlermeldungen bisher immer mitm debug
lösen können :smile:

und mal so gesagt, ich hab bisher nur eine handvoll tutorials
gemacht und ein programm zum starten anderer (vordefinierter)
:wink:

mein aktuelles programm is mein ersted richtiges Programm
welches auch funktioniert :smiley:

btw: ich hab das Problem teilweise lösen können, hab einfach

values[1] = reinterpret_cast(value5);
RegSetValueEx(openkeys[1], getvalues[1], NULL, REG_SZ,
values[1], NULL);

aus der NULL am ende folgendes gemacht:

sizeof(values[1]))
(die zahl dann für den jeweiligen wert)

da hatt ich übrigens auch schon bei den DWORD´s drin, drum
hatten die auch gleich unter XP funktioniert 8[

aber jetzt hab ich noch das prob, das die länge nicht stimmt,
z.b. kommt bei dem String „German“ nur „Germ“ raus…

ich hatt noch keine Zeit das ausgiebiger zu testen, aber ich
schätze mal die größe wird bei den Strings immer mit 4 Byte
angegeben…

Hallo Dead_Masters!

sizeof(values[1]) liefert die Größe des Datetyps values[1], und der ist vom typ char* und damit genau 4 Bytes groß. Du musst stattdessen wirklich die String-Länge angeben, die Du einfach mit strlen(values[1])) ermitteln kannst. Dann wird auch der String in der vollen Länge geschieben.

Ich würde Dir davon abraten, MFC-Bibliotheken statisch zu linken!
Machs einfach so wie bisher und verwende die Release-Version Deines Programmes, wenn es auf einem anderen Rechner zum Eisatz kommen soll.

Grüße Safog

Hallo Pauli!

Mir ist nicht ganz klar, was an meiner Aussage falsch sein
soll.
Ich habe nur gesagt, dass das Problem mit den fehlenden DLLs
nicht aufgetreten wäre, wenn eine Release-Version der
Anwendung zum Einsatz
gekommen wäre. Alle fehlenden DLLs sind nämlich inder
Release-Version Bestandteil jeder XP-Installation und damit
auf einem vollständig installierten System vorhanden. Also
besteht absolut keine Notwendigkeit, eine Anwendung mit eine
statisch gelinkten MFC-Moloch aufzublasen.
Ganz offensichtlicherweise hatte sein Projekt niemals statisch
gelinkte MFC-DLLs im Einsatz, was auch gut so ist.

Grüße Safog

hm also wenn ich die konfiguration von „Debug“ auf „Release“ umstelle bleibt alles gleich, bis auf den Ordner wos gespeichert wird.

und mit dedn Statischen Dll´s gehts jetzt :smile: das Programm ist auch nur ca 150kb größer geworden.

Näheres dazu findest du in meiner ViKa :stuck_out_tongue:

*gg* :smiley:

Richtig Stimmung gibt es erst, wenn du mit Zeigern arbeitest
und dann statt eines Zeigers, einen Fehlercode als Zeiger
verwendest :wink:))

klingt lusitg :wink:

sagen wir mal fast funktioniert :smile:)

*gg*

btw: ich hab das Problem teilweise lösen können, hab einfach

values[1] = reinterpret_cast(value5);
RegSetValueEx(openkeys[1], getvalues[1], NULL, REG_SZ,
values[1] , NULL);

aus der NULL am ende folgendes gemacht:

sizeof( get values[1])) ???
(die zahl dann für den jeweiligen wert)

das „get“ hast du aber reingemacht :wink:

naja mal kurz zur allgemeinen auflkärung:

getvalues[x] und values[x] sind unterschiedliche Arrays :wink:

im ersten ist der Name des Wertes drin und im zweiten kommt dann der wert des wertes rein… :wink:
(wie nennt man eigentlich diese dinger in den Registryschlüssel, also die zeichenfolgen und Dwords etc.? gibts dafür ne allgemeine bezeichnung, weil ich nenns immer „werte“ aber die werte haben ja auch nen wert (also das was dann drin steht) und das is irgendwie verwirrend :smiley: )

Der letze Parameter dient dazu Pufferüberläufe zu verhindern.

sizeof() liefert dir die anzahl Bytes, welche im Speicher
reserviert werden und schon zur Compilierzeit bekannt sind.
values[1] belegt 4 Bytes, da du aber die Deklaration von
values[] nicht angiebst kann ich dazu nicht viel mehr
sagen…

naj drum hab ich ja immer die zeile

values[1] = reinterpret_cast(value5);

mirgeposted, da dort der wert ja in „unsigned char *“ umgewandelt wird, woran man erkennen kann dass das Array ein „unsigned char *“ ist :wink:

Du müsstest strlen(values[1]) verwenden, welches dan die
Anzahl Bytes welche der String tatsächlich belegt liefert. Da
strlen() das Nullzeichen am Ende nicht mitzählt musst du noch
+1 anhängen.

die idde hatt ich sogar auch schon :smiley: aber ich hatte gestern nicht soviel zeit und hab erstmal das mit dem sizeof ausprobiert :wink:
werd nu aber mal mit dem versuchen, wird schon klappen :wink:

MfG Peter(TOO)

Mfg Dead_Masters ^.^

Hallo Dead_Masters!

sizeof(values[1]) liefert die Größe des Datetyps values[1],
und der ist vom typ char* und damit genau 4 Bytes groß. Du
musst stattdessen wirklich die String-Länge angeben, die Du
einfach mit strlen(values[1])) ermitteln kannst. Dann wird
auch der String in der vollen Länge geschieben.

Ich würde Dir davon abraten, MFC-Bibliotheken statisch zu
linken!
Machs einfach so wie bisher und verwende die Release-Version
Deines Programmes, wenn es auf einem anderen Rechner zum
Eisatz kommen soll.

Grüße Safog

das mit dem längenauslesen hab ich schon im anderen re^6 beantworted :wink:

zum linken: du meinst also wenn ich die konfiguration auf „Release“ umschalte geht das dann automatisch in Xp?
muss ich mal testen…

aber wieso räts du mir eigentlich von der statischen einbindung ab?

du hast recht entschuldigung
Hallo!

Ich wusste gar nicht dass die MFC Dll’s von Hause aus dabei sind.
Seit ich mal das Problem hatte dass ein Kunde die DLL’s nicht hatte linke ich immer statisch…

Aber was ist eigentlich wenn eine neue Version vom VisualStudio eine neue MFC DLL mitbringt?

Dann müsste man doch schauen dass auf dem Zielsystem die richtige Version der DLL’s liegt.
Das ist mir doch zu umständlich, und wegen 150K?

Gruß Pauli!

Hallo!

Ich wusste gar nicht dass die MFC Dll’s von Hause aus dabei
sind.

Etliche Windows-System-Programme verwenden die MFC DLLs.

Seit ich mal das Problem hatte dass ein Kunde die DLL’s nicht
hatte linke ich immer statisch…

Es empfielt sich immer, auf einer frisch installierten Zielplattform die Lauffähigkeit zu prüfen, bevor die Software zur Auslieferung kommt.

Aber was ist eigentlich wenn eine neue Version vom
VisualStudio eine neue MFC DLL mitbringt?

Dann müsste man doch schauen dass auf dem Zielsystem die
richtige Version der DLL’s liegt.
Das ist mir doch zu umständlich, und wegen 150K?

Alle MFC-DLLs sind abwärtskompatibel. Zudem sind erst in den neueren Versionen etliche Fehler und Speicherlöcher behoben, die in alten statisch gelinkten Programmen nach wie vor vorhanden sind.

Unter

http://www.informit.com/guides/content.asp?g=cpluspl…

findet man einen guten Überblick über Vor- und Nachteile.

Grüße Safog

aber wieso räts du mir eigentlich von der statischen
einbindung ab?

Unter

http://www.informit.com/guides/content.asp?g=cpluspl…

findet man einen guten Überblick über Vor- und Nachteile.

Grüße Safog

Unter

http://www.informit.com/guides/content.asp?g=cpluspl…

findet man einen guten Überblick über Vor- und Nachteile.

Grüße Safog

hast ja in dem anderen Post schon so schön beschrieben :smile:

hat übrigens wirklich einfach so funktioniert, als ich auf Release umgeschalted hatte :smiley:

damit dürften alle Probleme aus der welt sein, nochma thy na die ganze Hilfe :smile:

Mfg Dead_Masters