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:
    main

    int _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


Anmelden zum Antworten