[c++] In Registry schreiben

Bertelcraft

Mitglied
Hallo!

Ich habe mir ein kleines Programm geschrieben, welches einen Eintrag in den Run-Schlüssel der Registry macht. Jedoch kommt immer folgender Fehler:
c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\test\test\test.cpp(27) : error C2664: 'RegSetValueExA': Konvertierung des Parameters 2 von 'const wchar_t *' in 'LPCSTR' 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.

Hier der Code:
Code:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstring>
#pragma comment(lib, "User32.lib")

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{

    fstream datei;
	datei.open("C:\\rhz.bat", ios::out);
    datei << "rundll32.exe powrprof.dll,SetSuspendState" << endl;
    datei.close();

	HKEY hkey;
	HKEY KEY = HKEY_LOCAL_MACHINE;
	const wchar_t*place = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	const wchar_t*name= L"rhc";
	const wchar_t*value = L"C:\\rhz.bat";

	RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey); 
	RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, wcslen(value));
	RegCloseKey(hkey);
	return 0;
}

Wenn es was hilft: Ich habe Visual C++ 2005 EE und auf MultiByte Code umgestellt.

MfG
Bertelcraft
 
Hallo,

die Funktion RegOpenKeyEx erwartet als zweiten Parameter einen LPCTSTR Typ (quasi einen const char*) und du übergibst einen wchar_t (Multibyte Datentyp).

Code:
RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);

RegOpenKeyExW kann mit Multibyte umgehen, nimm lieber diese Funktion und lass den Cast auf LPCTSTR weg.

Gruß
 
Ich glaube, ich verstehe nicht ganz, was du meinst.

Wenn ich das ganze so mache, kommen wieder drei Fehlermeldungen.
Code:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstring>
#pragma comment(lib, "User32.lib")

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{

    fstream datei;
	datei.open("C:\\rhz.bat", ios::out);
    datei << "rundll32.exe powrprof.dll,SetSuspendState" << endl;
    datei.close();

	HKEY hkey;
	HKEY KEY = HKEY_LOCAL_MACHINE;
	const wchar_t*place = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	const wchar_t*name = L"rhc";
	const wchar_t*value = L"C:\\rhz.bat";

	RegOpenKeyExW(KEY,(LPCWSTR)place,0, KEY_ALL_ACCESS,&hkey); 
	RegSetValueExW(hkey, name, 0, REG_SZ, (BYTE *)value, wcslen(value));
	RegCloseKey(hkey);
	return 0;
}

Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__RegCloseKey@4" in Funktion "_wmain".
Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__RegSetValueExW@24" in Funktion "_wmain".
Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__RegOpenKeyExW@20" in Funktion "_wmain".
C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2005\Projects\Test\Debug\Test.exe : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.

Der Fehler kommt immer egal ob MultiByte oder Unicode.
 
Hallo,

hier hat der Linker einige Verweise nicht auflösen können, schau doch mal ob die die notwendigen Libs per pragma oder Projekteinstellungen angegeben hast.
In der MSDN (auch online) kann man die notwendigen Libs ermitteln.

Gruß
 
Zurück