Registry in Windows Forms auslesen
-
Hi Zusammen,
ich beschäftige mich nun wegen eines Schulprojektes das erste mal genauer mit Visual Studio 2008.
Nun habe ich ein Windows Forms Projekt in c++ erstellt und die Form1.h mit einem Button und einem Label ergänzt.Soweit war das ganze kein Problem!
Jetzt würde ich gerne über den Klick auf den Button einen Registry Wert aus der HKLM auslesen (In meinem Fall die System ID von Windows) und diese System ID im Label darstellen.
Leider jedoch klappt das ganz nicht bei mirIch habe "using namespace Microsoft::Win32; " eingebunden (laut Google brauch ich dieses für die Registry-Funktionen)
Und hier seht ihr nun meine kompletten Versuche von meinem Button (ich habe alles bisher Versucht ausgeklammert...).
Evtl. habe ich auch irgendwo nur einen Fehler mit einer Variable.
Es wär esuper nett, wenn mir hier Jemand helfen könnte!Vielen Dank schonmal im Voraus!
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { //RegOpenKey(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", &hKey); //label1->Text=RegQueryValueEx(hKey, "ProductId", NULL, NULL, temp, &size); //RegistryKey *regKey = Registry::CurrentUser->CreateSubKey(S"RememberMe"); //RegistryKey *regKey = Registry::LocalMachine->GetValue("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"); RegistryKey ^ rkLocalMachine = Registry::LocalMachine; RegistryKey ^ rkTest = rkLocalMachine->OpenSubKey( L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" ); RegistryKey *regKey = Registry::LocalMachine->OpenSubKey(L"SOFTWARE"); //string dValue = System::Convert::ToString(rkLocalMachine->GetValue("ProductId")); label1->Text= dValue; }
Lieben Gruß,
Antispy
-
Als Ergänzung:
Ich habe dieses hier bereits auch ausprobiert: http://www.c-plusplus.net/forum/viewtopic-var-t-is-116576.html
Leider ohne Erfolg
Ich bekomme hier sehr, sehr viele Meldung mit "nichtdeklarierter Bezeichner" ..
Lieben Gruß,
Antispy
-
Dieses hier habe ich auch ausprobiert:
CRegKey key; char buffer[256]; DWORD dwCount = sizeof( buffer); key.Open( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", KEY_READ); key.QueryValue( buffer, "ProductId", &dwCount); key.Close();
Da gibt es folgende Fehlermeldung:
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(90) : error C3641: "InterlockedExchangePointer": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(102) : error C3641: "ATL::_AtlGetConversionACP": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(535) : error C3641: "AtlA2WHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(554) : error C3641: "AtlW2AHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(572) : error C3641: "AtlA2WHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(577) : error C3641: "AtlW2AHelper": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlconv.h(530) : error C3641: "AtlDevModeW2A": Ungültige Aufrufkonvention "__stdcall " für eine Funktion, die mit /clr:pure oder /clr:safe kompiliert wurde.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atltrace.h(65) : error C2440: 'default argument': 'int (__cdecl *)(int,const char *,int,const char *,const char *,...)' kann nicht in 'ATL::CTrace::fnCrtDbgReport_t' konvertiert werden
1> Die Adresse einer Funktion liefert die __clrcall-Aufrufkonvention in /clr:pure und /clr:safe. Verwenden Sie evtl. __clrcall im Zieltyp.
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\atltrace.h(146) : fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.Diesen Tip nahm ich aus der FAQ.
Vielleicht sagt euch das etwas. ProductID ist außerdem ein REG_SZ. Ich bin mir nicht sicher, ob das irgendwie eine Rolle für diese Fehlermeldung spielt.Lieben Gruß,
Antispy
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
1. Lass mal das native C++ weg, das brauchst Du nicht (Code des 3. Posts)
2. Der von dir referenzierte FAQ Beitrag ist für C++, Du programmierst aber in C++/CLI
3.Leider jedoch klappt das ganz nicht bei mir
ist nicht genügend Information, dass Dir jmd. helfen könnte. Also poste die Fehlermeldungen.
Simon
Edit
Noch was: * gibts nicht in C++/CLI, dafür ist das ^ da.
-
using namespace Microsoft::Win32; //lesen Object ^rname = Registry::GetValue("HKEY_CURRENT_USER\\Software\\"+Produkt+"\\","Name","kein Eintrag"); rname = _name->ToString(); //speichern Registry::SetValue("HKEY_CURRENT_USER\\Software\\"+Produkt+"\\","Name",_name);
-
Hi tko,
ich habe nun einmal versucht Deine nQuellcode bei mir einzubauen
Object ^rname = Registry::GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\","ProductId","kein Eintrag"); rname = _name->ToString(); label1->Text = rname;
Leider bekomme ich hier folgende Meldung:
1>c:\...\Form1.h(200) : error C2065: '_name': nichtdeklarierter Bezeichner
1>c:\...\Form1.h(200) : error C2227: Links von "->ToString" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
1> Typ ist ''unknown-type''
1>c:\...\Form1.h(201) : error C2664: 'void System::Windows::Forms::Control::Text::set(System::String ^)': Konvertierung des Parameters 1 von 'System::Object ^' in 'System::String ^' nicht möglich
1> Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Ich habe hier leider noch ein Verständnisproblem
Wäre super, wenn mir Jemand helfen könnte. Vielen Dank!!
Lieben Gruß,
Antispy
-
mach aus _name einfach rname.
Edit: falsche Aussage...
-
Ich habe nun noch etwas weiter getestet und bin nun bei folgendem Punkt:
String^ _name; Object ^rname = Registry::GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\","ProductId","kein Eintrag"); rname = _name->ToString(); label1->Text = rname->ToString();
Das ganze lässt sich nun auch ausführen, doch wenn ich auf den Butten klicke, dann erhalte ich folgende Meldung:
"Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in LicenseReader.exe aufgetreten.
Zusätzliche Informationen: Object reference not set to an instance of an object.
"Wenn ich anschließend den Vorgang unterbreche, dann sehe ich ein neues Fenster in Visual Studio, welches sich "Auto" nennt. Hier kann ich dann in die Variable rname hereinsehen, was dort gespeichert ist.
Dort steht folgendes drin:
System::String^ "--*******-***" System::String^
Anstatt der * sind da natürlich Zahlen drin, welche ich hier nun aber ungerne posten wollte ^^
Laut Google kommt diese Fehlermeldung, weil ich auf ein NULL-Wert zugreife.
Lieben Gruß,
Antispy
-
Ja, dann schau doch mit dem Debugger wo diese Exception auftritt.
Irgendeine Referenz zeigt nicht auf ein gültiges Objekt.Simon
-
Ahhh ich werd bekloppt!!
Danke thete!!Sorry, war ein reiner Anfänger-Fehler *gg* Kenne mich leider mit Visual Studio nicht aus.
Hier nun das Ergebnis, wie es funktioniert, für alle anderen, denen es interessiert:
using namespace Microsoft::Win32; //lesen Object ^rname = Registry::GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\","ProductId","kein Eintrag"); label1->Text = rname->ToString();
Vielen Dank an alle!!
Lieben Gruß,
Antispy