equivalent zu std::find std::replace in ansi c
-
logo, aber wenn ich das später in die windows-registry schreiben will, MUSS es mit "\" sein, sonst geht's schief!
zb.: "C:\Temp\Programm.exe" in textform sieht in der Registry so aus:
"C:TempProgramm.exe"
doof, ne?schau dir zum vergleich mal eine .reg datei mit pfadangaben in notepad an...
-
Also erstmal zu der Funktion. Wie du hier siehst ist der Name blau geschrieben, d. h. das Wort register ist ein reserviertes Wort. Also solltest du niemals eine Funktion oder Variable register nennen, sonst gibts Probleme.
checkvalue braucht kein char-Array zu sein, sondern nur ein einzelnes char ( char checkvalue = '\'; ). Außerdem müsstest du dann die Überprüfung in deiner Schleife anders machen, wenn du es als char-Array lässt. Momentan überprüfst du nämlich, ob der Inhalt von cwdl gleich der Adresse(!) von checkvalue ist.
Dann ist da auch noch ein Fehler bei deinem "Ausschneiden" und "Einsetzen" in der Schleife. Das ganze musst du wenn dann so gestalten:
strncpy(templ, cwdl+i, sizeof(templ)); strncpy(cwdl+i, checkvalue, sizeof(cwdl)-i); if(cwdl+i+strlen(checkvalue)<sizeof(cwdl)) { strncpy(cwdl+i+strlen(checkvalue), templ, sizeof(cwdl)-i-strlen(checkvalue)); }
-
Vielleicht hab ich dich auch falsch verstanden. Aber ich hab zur Sicherheit getestet. Dieses kleine Stückchen Code schreibt den aktuellen Pfad in die Registry unter HKEY_CURRENT_USER\Test\Pfad. Ohne das ich irgendwas ersetzten muss.
#include <windows.h> int main() { char currentDirectory[MAX_PATH]; GetCurrentDirectory(MAX_PATH, currentDirectory); HKEY hKey; RegCreateKey(HKEY_CURRENT_USER, "Test", &hKey); RegSetValue(hKey, "Pfad", REG_SZ, currentDirectory, strlen(currentDirectory)); RegCloseKey(hKey); }
-
super! big thanx!
ich habe es mal mit dem code von nochmal: versucht.
vielen dank auch an AJ für den code, ich werde mir den für später mal kopieren...
ich hoffe meine fragen sind nicht allzu lästig.
bin halt ein newbie (habe aber dafür grosses interesse!) :pbtw: wozu ist eigentlich MAX_PATH gut?
jetzt hab ich nur folgendes problem:
mein compiler spuckt böse sachen aus:
C:\Borland\BCC55\Bin>bcc32 C:\myc\10.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\myc\10.c:
Error E2258 c:\myc\10.c 14: Declaration was expected in function reginsert
Error E2317 c:\myc\10.c 16: 'main' is not a parameter in function reginsert
Error E2257 c:\myc\10.c 16: , expected in function reginsert
*** 3 errors in Compile ***hier ist mal mein momentaner code:
#include <stdlib.h> #include <stdio.h> #include <windows.h> #include <winreg.h> const char target[255] = "Software\\Company\\Product\\Version"; char cwd1[MAX_PATH]; char cd[1]; /* here current drive gets defined to, e.g. C */ char cdcolon[2]; /* here current drive WITH COLON gets defined to, e.g. C: */ char crd[4]; /* here current drive's root directory gets defined to, e.g. C:\\ */ char nameval1[] = "TestCWD"; void reginsert(name, content); int main() { GetCurrentDirectory(MAX_PATH, cwd1); strncpy(cd, cwd1, 1); strncpy(cdcolon, cwd1, 2); strncpy(crd, cwd1, 4); /* printf("cwd is now: %s\n", str1); printf("justroot is: %s\n", justroot); commented out printf checks */ return 0; /* strcat(str1, str2); */ reginsert(nameval1, cwd1); return 0; } void reginsert(name, content) { HKEY hKey; RegCreateKey(HKEY_CURRENT_USER, target, &hKey); RegSetValue(hKey, name, REG_SZ, content, strlen(value)); RegCloseKey(hKey); return 0; }
-
MAX_PATH hat den Wert 260. Das ist die maximale Länge eines Pfads unter Windows.
-
@loki
Woher kommt die Variable value in deiner reginstert?@nochmal
Liegt die Grenze nicht bei 256?
-
AJ schrieb:
@nochmal
Liegt die Grenze nicht bei 256?Und dann kann man noch einen Dateinamen mit 3 Zeichen dazutun. + dem Backslash vor dem Dateinamen macht 260.
-
kann immer noch nicht compilen, immer noch dieselben fehlermeldungen...
kann es sein das die declaration von der funktion reginsert direkt unter das letzte #include muss ? hab das mal ausprobiert, dann bekomme ich aber noch mehr fehlermeldungen...
anybody knows how to help ?
-
Hast du value schon mit dem richtigen Variablennamen ersetzt?
Mir ist noch was aufgefallen. Welchen Typ haben denn die Parameter deiner reginsert???
-
meinst du die parameter, die an die funktion reginsert weitergegeben werden?
das 1. habe ich so definiert: char nameval1[] = "TestCWD";
und das 2. ist MAX_PATH, ich denke mal das ist halt ein standart-string.ich hab aber halt noch nicht so die grosse ahnung
ein guter anfang zur fehlersuche wäre zu wissen, ob ich die funktion richtig initialsisiert, definiert und aufgerufen habe.
zudem könnte es sein, dass ich die variablen als global definieren muss, aber nicht weiss ob ich das richtig gemacht habe...
-
Also:
Deine globalen Variablen hast du richtig deklariert. Wobei man eigentlich vermeiden sollte globale Variablen zu machen, wenn es auch lokal geht (also in der Funktion bzw. Main).
Die Deklaration deiner Funktion ist falsch, weil die Datentypen der Übergabeparameter fehlen. Diese sollten beide char * sein, da du ja in beiden Fällen einen string bzw. char-array übergibst.
Bei der Definition der Funktion sind die Datentypen zwar nicht unbedingt erforderlich (kann aber auch vom Compiler abhängen), sollten aber zumindest wegen der Übersichtlichkeit auch angegeben werden.Der Aufruf deiner Funktion passt.
Was mir noch aufgefallen ist:
Die Länge deiner char-arrays cd, cdcolon und crd ist zu kurz! Du musst immer das Stringendezeichen (= '\0' bzw. 0) miteinberechnen und am besten auch setzen, besonders bei strn...-Funktionen.
Warum machst du eigentlich einen return vor deinem Funktionsaufruf?
-
wow! wahnsinn! es funktioniert!
vielen dank für die tolle und schnelle hilfe!!!
ich poste den korrigierten code nochmal, vielleicht kann sich ja jemand daran orientieren...
#include <stdlib.h> #include <stdio.h> #include <windows.h> #include <winreg.h> void reginsert(char *name, char *content, char *keytarget); int main() { char target[255] = "Software\\Company\\Product\\Version"; char cwd1[MAX_PATH]; char cd[2]; /* here current drive gets defined to, e.g. C */ char cdcolon[3]; /* here current drive WITH COLON gets defined to, e.g. C: */ char crd[5]; /* here current drive's root directory gets defined to, e.g. C:\\ */ char nameval1[] = "TestCWD"; GetCurrentDirectory(MAX_PATH, cwd1); strncpy(cd, cwd1, 1); strncpy(cdcolon, cwd1, 2); strncpy(crd, cwd1, 4); reginsert(nameval1, cwd1, target); return 0; } void reginsert(char *name, char *content, char *keytarget) { HKEY hKey; RegCreateKey(HKEY_CURRENT_USER, keytarget, &hKey); RegSetValue(hKey, name, REG_SZ, content, strlen(content)); RegCloseKey(hKey); return; }
-
noch eine ganz kleine frage:
wie bekomme ich das programm dazu, in der registry statt in den schlüssel (standard) in einen selbstdefinierten schlüssel zu schreiben?
muss ich dafür einen anderen api-call benutzen?
-
Das frägst du am besten im WinAPI-Forum nach ;).