Reg problem

hi
könnte mir vlt jemand helfen, ich möchte gerne einen reg wert setzen, zum autostart, erhalte aber immer die unten angegebene fehlermeldung.
ich arbeite mit windows forms, mit MS VC++ Express
Code:

private: System::Void Form1\_Load(System::open\_mouth:bject^ sender, System::EventArgs^ e)
{
HKEY hKey;
BYTE cString[]="C:\\Programme\\Programm.exe";
RegSetValueEx(hKey,\_T("HKEY\_CURRENT\_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"),0,REG\_SZ,cString,strlen(cString)+1);
} 
Code:
private: System::Void Form1\_Load(System::open\_mouth:bject^ sender, System::EventArgs^ e)
{
HKEY hKey;
BYTE cString[]="C:\Programme\Programm.exe";
RegSetValueEx(hKey,\_T("HKEY\_CURRENT\_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"),0,REG\_SZ,cString,strlen(cString)+1);
} 
Code:
private: System::Void Form1\_Load(System::open\_mouth:bject^ sender, System::EventArgs^ e)
{
HKEY hKey;
BYTE cString[]="C:\Programme\Programm.exe";
RegSetValueEx(hKey,\_T("HKEY\_CURRENT\_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"),0,REG\_SZ,cString,strlen(cString)+1);
} 

DIESE FEHLERMELDUNG KOMMT DANN
2005\projects\das_spiel\das_spiel\Form1.h(197) : error C2664: ‚strlen‘: Konvertierung des Parameters 1 von ‚BYTE [24]‘ in ‚const char *‘ nicht möglich

und es wäre ganz nett wennmir jemand sagen könnte wie ich einen wert ändere
danke
zapp91

_[MOD:

-Tags hinzugefügt, bitte in Zukunft selbst machen]_ 

Hallo zapp91,

DIESE FEHLERMELDUNG KOMMT DANN
2005\projects\das_spiel\das_spiel\Form1.h(197) : error C2664:
‚strlen‘: Konvertierung des Parameters 1 von ‚BYTE [24]‘ in
‚const char *‘ nicht möglich

Eigentlich steht ja da, was falsch ist :smile:

strlen() verlangt als Parameter einen String also ein Array aus char.
Dein cString besteht aber aus dem Typ BYTE.

Du musst also casten:
strlen((char *)cString)+1

MfG Peter(TOO)

Ich hab jetzt ein paar stunden rum getüfftelt, aber ich bekomme es nicht so recht in den griff. Das soll jetzt nicht so aussehen als wäre ich zu faul selbst was zu machen, aber ich bekomme es wirklich nich hin. Könnte mir vlt jemand von euch, den code auf mein beispiel anpassen, dass er eurer meinung nach funktioniert??
das wäre wirklich nett.
danke
manuel

Hallo Manuel,

Wie Peter(TOO) bereits geschrieben hat must du den Typ von cString umbiegen. cString ist ein BYTE array waehrend strlen einen const char-Pointer verlangt (const char*).

  1. BYTE cString[]=„C:\Programme\Programm.exe“;

  2. BYTE* pByteString = cString;

  3. char* pCharString = pByteString; // error

  4. char* pCharString = (char*)pByteString; // ok

  5. char* pCharString = reinterpret_cast(pByteString); // ok

  6. size_t len = strlen(pCharString);

  7. Hier wird das BYTE array erzeugt.

  8. Hier erzeugen wir einen Pointer auf das erste Element des Byte-Arrays

  9. Hier versuchen wir einem char* einen BYTE pointer zuzuweisen, dies geht jedoch schief.

  10. Das ist die erste Moeglichkeit den BYTE pointer in einen char pointer zu ‚casten‘, wir verwenden einen C-Style-Cast (was so viel heisst, dass es C-Syntax ist und so in C verwendet wird).

  11. Das ist nun die zweite Moeglich um unter C++ einen pointer zu casten. reinterpret_cast ist ein C+±Cast und wird verwendet um einen Pointer-Typ in einen anderen Pointer-Typ zu casten. (Funktioniert nicht in C!)

Gluecklicherweise brauchst Du aber nicht alle diese Kommandos hinschreiben, es genuegt wenn du cString direct auf einen char-Pointer castest. Ich wuerde Dir raten hier den C+±Cast zu benutzen, ist imho sauberer. (Es gibt noch andere C+±Casts, schlag einfach mal im Internet nach, stichwort static_Cast, dynamic_cast, const_cast und reinterpret_cast).

Loesung Deines Problems:

private: System::Void Form1_Load(System::open_mouth:bject^ sender, System::EventArgs^ e)
{
HKEY hKey;
BYTE cString[]=„C:\Programme\Programm.exe“;
RegSetValueEx(hKey,_T(„HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run“),0,REG_SZ,cString,strlen(reinterpret_cast(cString))+1);
}
Code:
private: System::Void Form1_Load(System::open_mouth:bject^ sender, System::EventArgs^ e)
{
HKEY hKey;
BYTE cString[]=„C:\Programme\Programm.exe“;
RegSetValueEx(hKey,_T(„HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run“),0,REG_SZ,cString,strlen(reinterpret_cast(cString))+1);
}
Code:
private: System::Void Form1_Load(System::open_mouth:bject^ sender, System::EventArgs^ e)
{
HKEY hKey;
BYTE cString[]=„C:\Programme\Programm.exe“;
RegSetValueEx(hKey,_T(„HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run“),0,REG_SZ,cString,strlen(reinterpret_cast(cString))+1);
}

Hoffe das hilft. Gruesse

Peer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]