Anfängerfrage - Immer wieder Probleme bei den APIs + Win32-Projecte in VC++08 + allgemeine noobfragen
-
hiho,
ich bin relativ neu hier und im thema C++ und hab versucht anhand von geposteten beispielen den code besser zu verstehen. die grundlagen zu lernen ging ja relativ einfach... zumindest wenns um win32-SHELL(!)-anwendungen geht (gefühlt). jetzt möchte aber ich natürlich zeitgemäße win-GUIs verwenden. hier finde ich irgendwie keine guten tutorials die zumindest mal bei den grundlagen anfangen (programmstrukturen oder arbeiten mit wxWidgets...etc). mir fehlt da ein einfacher überblick... 1 frage: wo finde ich videos/tutors dazu.2. ich versuche das problem zu lösen indem ich anhand von geposteten code ausprobiere. leider laufen sind 95% der programme bzw sources nicht. fast immer gibts irgendwelche fehler die ich schwer lösen kann. und meistens sinds APIs... hier mal ein beispiel (siehe unten). ich hab mir den code als header (regadd.h.) in einen Win32-GUI-project eingebunden. mit #include "regadd.h" binde ich ihn in der main.cpp ein. gibt immer wieder fehler bei den APIs ... das ist auch nur ein beispiel von vielen ... ständig fehler bei den APIs
main.cpp
// regtest2.cpp : Definiert den Einstiegspunkt für die Anwendung. // #include "stdafx.h" #include "regtest2.h" #include "regadd.h" int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CreateRegistryEntry ("Autostart"); }regadd.h
void CreateRegistryEntry (char *lpEntryName, char *lpEntryOption = NULL, char *lpEntryValue = NULL, HKEY hKey = HKEY_LOCAL_MACHINE, char *lpRegistryPath = NULL) { HKEY hk; char szBuffer[MAX_PATH + 2]; char szResult[MAX_PATH + 5 + sizeof (lpEntryOption)]; GetModuleFileName (NULL, szBuffer, MAX_PATH); if (lpRegistryPath == NULL) RegCreateKey (hKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk); else RegCreateKey (hKey, lpRegistryPath, &hk); if (lpEntryValue == NULL) { if (lpEntryOption == NULL) lstrcpy (szResult, szBuffer); else wsprintf (szResult, "\"%s\" %s", szBuffer, lpEntryOption); RegSetValueEx (hk, lpEntryName, 0, REG_SZ, szResult, strlen (szResult)); } else RegSetValueEx (hk, lpEntryName, 0, REG_SZ, lpEntryValue, strlen (lpEntryValue)); RegCloseKey (hk); } void DeleteRegistryEntry (char *lpEntryName, HKEY hKey = HKEY_LOCAL_MACHINE, char *lpRegistryPath = NULL) { HKEY hk; if (lpRegistryPath == NULL) RegCreateKey (hKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk); else RegCreateKey (hKey, lpRegistryPath, &hk); RegDeleteValue (hk, lpEntryName); RegCloseKey (hk); } bool PeruseRegistryEntry (char *lpEntryName, HKEY hKey = HKEY_LOCAL_MACHINE, char *lpRegistryPath = NULL) { HKEY hk; bool bReturn = false; if (lpRegistryPath == NULL) RegCreateKey (hKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk); else RegCreateKey (hKey, lpRegistryPath, &hk); if (RegQueryValueEx (hk, lpEntryName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) bReturn = true; else bReturn = false; RegCloseKey (hk); return bReturn; }fehler:
1>------ Erstellen gestartet: Projekt: regtest2, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>regtest2.cpp 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(11) : error C2664: 'GetModuleFileNameW': Konvertierung des Parameters 2 von 'char [262]' in 'LPWCH' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(14) : error C2664: 'RegCreateKeyW': Konvertierung des Parameters 2 von 'const char [46]' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(16) : error C2664: 'RegCreateKeyW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(21) : error C2664: 'lstrcpyW': Konvertierung des Parameters 1 von 'char [269]' in 'LPWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(23) : error C2664: 'wsprintfW': Konvertierung des Parameters 1 von 'char [269]' in 'LPWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(25) : error C2664: 'RegSetValueExW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(28) : error C2664: 'RegSetValueExW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(40) : error C2664: 'RegCreateKeyW': Konvertierung des Parameters 2 von 'const char [46]' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(42) : error C2664: 'RegCreateKeyW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(44) : error C2664: 'RegDeleteValueW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(57) : error C2664: 'RegCreateKeyW': Konvertierung des Parameters 2 von 'const char [46]' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(59) : error C2664: 'RegCreateKeyW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(61) : error C2664: 'RegQueryValueExW': Konvertierung des Parameters 2 von 'char *' in 'LPCWSTR' nicht möglich 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. 1>Das Buildprotokoll wurde unter "file://c:\Users\Winkelmann\Documents\Visual Studio 2008\Projects\regtest2\regtest2\Debug\BuildLog.htm" gespeichert. 1>regtest2 - 13 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Project -> [Name] Properties...
Configuration: All Configurations
Configuration Properties -> General
Character Set: Use Multi-Byte Character Set
OK
-
Work0r schrieb:
Project -> [Name] Properties...
Configuration: All Configurations
Configuration Properties -> General
Character Set: Use Multi-Byte Character Set
OKbei mir ist es auf deutsch und heisst zeichensatz

allerdings habe ich woanders gelesen ich solle doch bitte unbedingt auf unicode umstellen eben in den optionen oder auch von "#undef UNICODE" ist die rede. - deine aussage verwirrt mich jetzt... wann denn nu unicode und wann nicht ?wenn ich auf "Use Multi-Byte Character Set" stelle gibts immernoch fehlerverweise auf APIs:
1>------ Erstellen gestartet: Projekt: regtest2, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>stdafx.cpp 1>Kompilieren... 1>regtest2.cpp 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(25) : error C2664: 'RegSetValueExA': Konvertierung des Parameters 5 von 'char [269]' in 'const BYTE *' nicht möglich 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. 1>c:\users\winkelmann\documents\visual studio 2008\projects\regtest2\regtest2\regadd.h(28) : error C2664: 'RegSetValueExA': Konvertierung des Parameters 5 von 'char *' in 'const BYTE *' nicht möglich 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. 1>Das Buildprotokoll wurde unter "file://c:\Users\Winkelmann\Documents\Visual Studio 2008\Projects\regtest2\regtest2\Debug\BuildLog.htm" gespeichert. 1>regtest2 - 2 Fehler, 0 Warnung(en)auch die verschienden APIs RegSetValueExA/RegSetValueEx/RegSetValueExW verwirren mich .... der buchstabe heisst meines wissen nach A = ANSI ... W - ? aber wann nimmt man hier welche variante und was ist der unterschied zu UNICODE bzw hat das überhaupt damit was zu tun ?
-
Alle neueren Windows-Betriebssysteme verwenden intern WideChars (wchar_t*), die Funktionen dazu heissen dann z.B. RegSetValueExW(), die Ansi-Versionen (char*) heissen RegSetValueExA().
Viele Tutorials sind zu Windows9x-Zeiten (oder noch früher) geschrieben worden und damals konnte Win9x Unicode nicht wirklich: http://msdn.microsoft.com/en-us/goglobal/bb688166.aspx
Inzwischen ist Unicode bei Visual Studio standardmässig eingeschaltet und verursacht somit Probleme bei Tutorials die nicht angepasst wurden

Guckt man sich z.B. mal diese Funktion an:
BOOL SetWindowText(HWND hWnd, LPCTSTR lpString);...macht der Compiler bei aktivem Unicode ("#define UNICODE") daraus folgendes:
BOOL SetWindowTextW(HWND hWnd, const wchar_t* lpString);...und wenn Unicode aus ist:
BOOL SetWindowTextA(HWND hWnd, const char* lpString);wchar_t ist 16-Bit großer Datentyp der ein Unicode-Zeichen beinhaltet.
char ist ein 8-Bit großer Datentyp der ein Ansi-Zeichen beinhaltet.Microsoft hat ein paar Typen eingeführt, die quasi als "Abkürzung" dienen:
LPCTSTR = "const TCHAR*"
LPCSTR = "const char*"
LPCWSTR = "const wchar_t*"
...und dasselbe nochmal ohne "const":
LPTSTR = "TCHAR*"
LPSTR = "char*"
LPWSTR = "wchar_t*"(LP steht übrigens laut msdn für "Long Pointer", im Netz auch oft "Large Pointer" genannt)
TCHAR wird wenn Unicode an ist zu "wchar_t", wenn es aus ist zu "char".
Wenn du z.B. TEXT("HALLO") verwendest kannst du dein Programm sowohl mit als auch ohne Unicode kompilieren, denn er macht aus TEXT("HALLO") dann je nachdem ob Unicode aus oder an ist einfach "HALLO" als char's oder "HALLO" als wchar_t's
-----Zu deinem Fehlern:
Konvertierung des Parameters 5 von 'char [269]' in 'const BYTE *' nicht möglich
Die Funktion RegSetValueExA() möchte als 5. Parameter gerne einen "const BYTE*" bekommen, du gibts ihm aber einen "char[269]".
Du kannst die Funktion überreden "char[269]" einfach als "const BYTE*" anzusehen, indem du castest:
[cpp]RegSetValueEx (hk, lpEntryName, 0, REG_SZ, *(const BYTE)**szResult, strlen (szResult));[/cpp]
-
@geeky: das sollte in die FAQ!!
-
Du solltest übrigens besser die Rückgabewerte der Registry-Funktionen berücksichtigen

Solltest du unter Vista/Win7 arbeiten, wird dein Visual Studio sehr wahrscheinlich nicht mit Admin-Rechten laufen und deine Anwendung dann ebenfalls nicht - Und ich bin mir nahezu sicher, dass das Schreiben in "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" nur als Admin erlaubt ist...
-
auf jeden fall läuft es ... jetzt danke für diese ausführliche antwort. auch wenn ich beim thema pointer und APIs noch totale bildungslücken habe ist ein erfolg schonmal viel wert.... ich hoffe ich schnalls noch
*kopf schwirrt*
-
bei mir ist es auf deutsch und heisst zeichensatz
Dann installier dir ganz schnell ein englisches Visual Studio.
Mit einem deutschen Studio zu arbeiten ist nur mühsam. Fast alle guten Infos die man im Netz zu VS findet beziehen sich auf die englische Studio Version -- selbst wenn der Text eines Artikels deutsch ist. Wenn man dann z.B. deutsche Strings (z.B. aus Menus, Dialogen oder auch Fehlermeldungen) in Google sucht, findet man viel viel weniger brauchbares, als wenn man den englischen String sucht.
-
Kann ich bestätigen, die englische Version erleichtert einem das Leben

Ist mit schleierhaft wieso das überhaupt übersetzt wird...
-
hmmm, ist mir nicht ganz einleuchten, wenn ich was mit der hilfe-funktion suche, sortiert diese die deutschen themen nach oben und die englischen werden trotzdem weiter unterhalb aufgeführt. - von daher ergibt das keinen sinn für mich ... ich finde C++ zu lernen ja schon nicht wirklich einfach, das ganze in einer fremdsprache ist noch schwerer... hmmpf...
-
was ist daran nicht einleuchtend? die sprache der informatik ist nunmal englisch. die meiste literatur ist - zumindest im original - in englisch. das meiste was man im internet findet ist in englisch. die ganzen fachbegriffe sind auch englisch. und keywords in programmiersprachen sowieso.
glaub mir einfach wenn ich sage: wenn du nicht gut englisch kannst, bist du in der informatik-welt ziemlich aufgeschmissen. ja, man kann sich mit deutsch durchschlagen, aber es ist (viel) einfacher wenn man gut englisch kann.
-
ich hab ja nicht gesagt, dass ich kein englisch kann und auch nicht dass ich dir es nicht glaube. es ging nur darum warum ich die version wechseln soll, wenn sie doch auch bei der suche nach englischsprachigen kontext anzeigt.