Registry lesen/schreiben ohne .NET
-
Hallo,
ich habe nun mittlerweile alles mögliche getestet und natürlich auch die FAQ gelesen. Allerdings komme ich nicht wirklich zu einem Ergebnis.
Problem: Klasse ohne .NET die einen REG_SZ als std::string ausgibt bzw. einen einen std::string als REG_SZ in die Registry schreibt. Bzw. das gleiche mit int/DWORD.
Das lesen eines DWORD hat soweit funktioniert, nur beim string kommt immer nur der erste Buchstabe an?! Im Moment arbeitet die Klasse noch mit char*, statt mit std::string.
Konsolen-Anwendung:
mainint _tmain(int argc, _TCHAR* argv[]) { registry *regObj = new registry(); char *path = regObj->readString(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\testApp"),TEXT("path")); cout << path << "\n"; return 0; }Klasse-Registry
header:#pragma once class registry { public: registry(void); public: ~registry(void); char* readString(HKEY hKey, TCHAR* hSubKey, TCHAR* hValue); DWORD readInteger(HKEY hKey, TCHAR* hSubKey, TCHAR* hValue); };code:
#include "StdAfx.h" registry::registry(void) {} registry::~registry(void) {} char* registry::readString(HKEY hKey, TCHAR* hSubKey, TCHAR* hValue) { HKEY NEWhKey; TCHAR SubKey[MAX_PATH]; TCHAR Data[MAX_PATH]; lstrcpy(SubKey, hSubKey); lstrcpy(Data, hValue); DWORD dwData=0; char *bData; RegOpenKey(HKEY_LOCAL_MACHINE,SubKey,&NEWhKey); if(RegQueryValueEx(NEWhKey, Data, 0, 0, (PBYTE)NULL, &dwData)==ERROR_SUCCESS && NEWhKey!=NULL) { bData=(char *)malloc(sizeof(char)*dwData); RegQueryValueEx(NEWhKey, Data, 0, 0,(PBYTE)(LPTSTR)bData,&dwData); } RegCloseKey(NEWhKey); return bData; } DWORD registry::readInteger(HKEY hKey, TCHAR* hSubKey, TCHAR* hValue) { HKEY NEWhKey; TCHAR SubKey[MAX_PATH]; TCHAR Data[MAX_PATH]; lstrcpy(SubKey, hSubKey); lstrcpy(Data, hValue); DWORD dwNumber = 0; DWORD dwData = sizeof(DWORD); RegOpenKey(HKEY_LOCAL_MACHINE,SubKey,&NEWhKey); RegQueryValueEx(NEWhKey, Data, NULL, NULL,(BYTE*)&dwNumber,&dwData); RegCloseKey(NEWhKey); return dwNumber; }Der Code ist mittlerweile alles andere als sauber, weil ich schon so viel probiert habe. Warum kommt beim auslesen des Pfades von TestApp (path) immer nur der erste Buchstabe?!?
Danke.
-
EDIT: Blödsinnn

Weil du aus der Registry wide-character-strings bekommst, die du erst nach narrow-character konvertieren musst.
-
Danke für die Antwort. ich hab aber schon ganzen Tag danach gesucht. Wie muss die Methode readString() dann richtig aussehen. Bzw. wie muss "RegQueryValueEx(NEWhKey, Data, 0, 0,(PBYTE)(LPTSTR)bData,&dwData);" aussehen? Und wie konvertiert man zwischen char und wchar?!
-
Es gibt zwei Wege zum Ziel:
Enweder man schaltet den Compiler von UNICODE auf MULTIBYTE. Dann ist LPTSTR nur ein typedef für char*. Oder, falls, wie bei meinen Programm, UNICODE benötigt wird, nimmt man Weg 2.
#include <stdlib.h>char* registry::readString(HKEY hKey, TCHAR* hSubKey, TCHAR* hValue) { HKEY NEWhKey; TCHAR SubKey[MAX_PATH]; TCHAR Data[MAX_PATH]; lstrcpy(SubKey, hSubKey); lstrcpy(Data, hValue); DWORD dwData=0; LPTSTR *bData; RegOpenKey(HKEY_LOCAL_MACHINE,SubKey,&NEWhKey); if(RegQueryValueEx(NEWhKey, Data, 0, 0, (PBYTE)NULL, &dwData)==ERROR_SUCCESS && NEWhKey!=NULL) { bData=(LPTSTR *)malloc(sizeof(LPTSTR)*dwData); RegQueryValueEx(NEWhKey, Data, 0, 0,(PBYTE)(LPTSTR)bData,&dwData); } RegCloseKey(NEWhKey); char *cData=(char *)malloc(sizeof(char)*dwData); wcstombs(cData, (wchar_t*)bData,dwData); return cData; }Oder zumindest so ähnlich...
wcstombs(cData, (wchar_t*)bData,dwData); konvertiert hier einen "widecharacterstring to multibytestring".
Weitere Infos hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-171319-and-highlight-is-wchart.html