[VS C++ 2008 EE] Registry lesen/schreiben/löschen
-
Hallo zusammen,
ich habe ein kleines Problem und zwar möchte ich gerne, dass wenn ich auf eine Checkbox klicke (kann auch ein Button sein - spielt keine Rolle), ein Registry-Schlüssel erstellt wird bzw. Ordner. Das Programm soll also erst einen Ordner erstellen und anschließend einen Schlüssel darin mit irgendein Wert. Ich hab hier mal "test1" und "test2" für Name und Wert genommen.
Wenn der Schlüssel schon vorhanden ist, soll er mir es mir mitteilen. Denn alten evtl. löschen und den neuen erstellen. (soweit kam ich bis jetzt noch nicht, da ich es nicht mal schaffe überhaupt einen Schlüssel / Ordner zu erstellen)
Leider bekomme ich es überhaupt nicht hin, bin natürlich so ziemlich ein C++ Anfgänger³.
Der Code sieht wie folgt aus:#include <iostream> #include <windows.h> #include <stdio.h> #include <string.h> #include <conio.h> #include <shellapi.h> #include <stdlib.h> #include <fstream> #include <tchar.h> #include <cstdio> #include <winuser.h> ... private: System::Void checkBox1_CheckedChanged(System::Object^ sender, System::EventArgs^ e) { HKEY hKey; // Registry-Key erstellen RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Test", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, 0); // In Registry-Key schreiben RegSetValueEx(hKey, 0, 0, REG_SZ, "test1", strlen("test2")); // Registry-Key Schließen RegCloseKey(hKey); }(für Testzwecke hab ich im übrigen ziemlich viele Includes... was aber eigentlich egal ist)
Jetzt wird mir natürlich folgendes ausgegeben:error C2664: 'RegCreateKeyExW': Konvertierung des Parameters 2 von 'const char [64]' in 'LPCWSTR' nicht möglich Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. error C2664: 'RegSetValueExW': Konvertierung des Parameters 5 von 'const char [6]' in 'const BYTE *' nicht möglich Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Das ich irgendetwas vergessen habe ist mir bewust, nur was ist die Frage und wie ich es ändern kann bzw. mit dem Pfad, so wie er jetzt ist mag er ihn wohl nicht.

Hat vielleicht jemand einen fertigen Codeschnipsel für dieses Problem? Oder kann mir es jemand erklären mit den fehlenden Komponenten?
Die Suchfunktion hat mir in diesem Fall nicht wirklich geholfen bzw. im Internet fand ich keine Lösung ohne das irgendwelche _T"blub" / L"blubb" definitionen fehlten.
-
Entweder so:
#include <iostream> #include <windows.h> #include <stdio.h> #include <string.h> #include <conio.h> #include <shellapi.h> #include <stdlib.h> #include <fstream> #include <tchar.h> #include <cstdio> #include <winuser.h> ... private: System::Void checkBox1_CheckedChanged(System::Object^ sender, System::EventArgs^ e) { HKEY hKey; // Registry-Key erstellen RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Test"), 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, 0); // In Registry-Key schreiben RegSetValueEx(hKey, 0, 0, REG_SZ, reinterpret_cast<const Byte*>("test1"), strlen("test2")); // Registry-Key Schließen RegCloseKey(hKey); }oder bezogen auf das wchar_t-Problem: In den Projektoptionen den Zeichensatz umstellen.
-
Mit deinem Beispiel bekomme ich folgende Ausgabe:
error LNK2028: Nicht aufgelöstes Token (0A000015) ""extern "C" long __stdcall RegCloseKey(struct HKEY__ *)" (?RegCloseKey@@$$J14YGJPAUHKEY__@@@Z)", auf das in Funktion ""private: void __clrcall Modul38::Form1::checkBox1_CheckedChanged(class System::Object ^,class System::EventArgs ^)" (?checkBox1_CheckedChanged@Form1@Modul38@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)" verwiesen wird. error LNK2028: Nicht aufgelöstes Token (0A000016) ""extern "C" long __stdcall RegSetValueExA(struct HKEY__ *,char const *,unsigned long,unsigned long,unsigned char const *,unsigned long)" (?RegSetValueExA@@$$J224YGJPAUHKEY__@@PBDKKPBEK@Z)", auf das in Funktion ""private: void __clrcall Modul38::Form1::checkBox1_CheckedChanged(class System::Object ^,class System::EventArgs ^)" (?checkBox1_CheckedChanged@Form1@Modul38@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)" verwiesen wird. error LNK2028: Nicht aufgelöstes Token (0A000017) ""extern "C" long __stdcall RegCreateKeyExA(struct HKEY__ *,char const *,unsigned long,char *,unsigned long, unsigned long,struct _SECURITY_ATTRIBUTES * const,struct HKEY__ * *,unsigned long *)" (?RegCreateKeyExA@@$$J236YGJPAUHKEY__@@PBDKPADKKQAU_SECURITY_ATTRIBUTES@@PAPAU1@PAK@Z)", auf das in Funktion ""private: void __clrcall Modul38::Form1::checkBox1_CheckedChanged(class System::Object ^,class System::EventArgs ^)" (?checkBox1_CheckedChanged@Form1@Modul38@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)" verwiesen wird. error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" long __stdcall RegCloseKey(struct HKEY__ *)" (?RegCloseKey@@$$J14YGJPAUHKEY__@@@Z)" in Funktion ""private: void __clrcall Modul38::Form1::checkBox1_CheckedChanged(class System::Object ^,class System::EventArgs ^)" (?checkBox1_CheckedChanged@Form1@Modul38@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)". error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" long __stdcall RegSetValueExA(struct HKEY__ *,char const *,unsigned long,unsigned long,unsigned char const *,unsigned long)" (?RegSetValueExA@@$$J224YGJPAUHKEY__@@PBDKKPBEK@Z)" in Funktion ""private: void __clrcall Modul38::Form1::checkBox1_CheckedChanged(class System::Object ^,class System::EventArgs ^)" (?checkBox1_CheckedChanged@Form1@Modul38@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)". error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" long __stdcall RegCreateKeyExA(struct HKEY__ *,char const *, unsigned long,char *,unsigned long,unsigned long,struct _SECURITY_ATTRIBUTES * const,struct HKEY__ * *,unsigned long *)" (?RegCreateKeyExA@@$$J236YGJPAUHKEY__@@PBDKPADKKQAU_SECURITY_ATTRIBUTES@@PAPAU1@PAK@Z)" in Funktion ""private: void __clrcall Modul38::Form1::checkBox1_CheckedChanged(class System::Object ^,class System::EventArgs ^)" (?checkBox1_CheckedChanged@Form1@Modul38@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)".Mit oder ohne umstellen des Zeichensatzes.
Müsst ich nicht erst noch irgendwas machen damit,_T("Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Test")überhaupt möglich ist? Ich hatte das auch schon alles Probiert genauso wie mit "L" und was weiß ich aber außer den Fehlermeldungen oben kam nix bei raus.

Ich habe im übrigen Windows Vista falls das eine Rolle spielen könnte.
-
Da wird irgendeine Lib nicht gelinkt, was daran liegt, dass du CLI verwendest. Entweder du linkst die richtigen Libs manuell, machst ein neues Projekt ohne CLI(-Mist) bzw. änderst das vorhandene oder suchst nach einer CLI-eigenen Möglichkeit die Registry zu erreichen.
-
Ah... Dank deines Beitrages ist mir aufgefallen das ich überhaupt nicht die benötigte (in diesem Fall Advapi32.lib und Advapi32.dll) gelinkt habe wie es in der MSDN steht. Hab die zwar hundert mal gelesen aber anscheinden nicht wahrgenommen.
die Advapi32.lib hab ich bereits mit
#pragma comment(lib, "Advapi32")gelinkt und das Programm startet wieder ohne Fehlermedlung wobei aber noch die Advapi32.dll fehlt.
Weiß jemand wie ich die einbinden kann?
EDIT: Ok, die *.dll ist anscheinend nicht nötig damit ich Registry Einträge schreiben bzw. erstellen kann.