WINAPI mit microsoft visual c++ zu kompilieren und mit visual studio nicht
-
hi. hab hier einen quellcode von einem normalen windowsfenster. wenn ich ihn mit microsoft visual c++ kompiliere klappt dies ohne probleme, bei visual studio allerdings werden dort 3 fehler und eine warnung angezeigt (siehe anhang)
// ***************************************************************************** // LISTING1.CPP // // Beispiel zur Verwendung der Win32-API // ***************************************************************************** //////////////////////////////////////////////////////////////////////////////// // Includes //////////////////////////////////////////////////////////////////////////////// #include <windows.h> //////////////////////////////////////////////////////////////////////////////// // Funktion: WndProc // Parameter: HWND hwnd Fensterhandle // UINT message Nachrichts-ID // UINT wParam 1. Nachrichten-Parameter // LONG lParam 2. Nachrichten-Parameter //////////////////////////////////////////////////////////////////////////////// // WndProc ist die Nachrichtenfunktion unseres Programms. Nur WM_PAINT und // WM_DESTROY werden explizit behandelt, für alle weiteren Nachrichten greifen // wir auf die Standardbehandlungsroutinen von Windows zurück //////////////////////////////////////////////////////////////////////////////// // Rückgabewerte: 0 kein Fehler //////////////////////////////////////////////////////////////////////////////// long CALLBACK WINAPI WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam) { // lokale Variablen HDC hdc; // Handle für Gerätekontext PAINTSTRUCT ps; // Struktur für Zeichenoperationen RECT rect; // Rechteckstruktur switch (message) { case WM_PAINT: // Fenster neu zeichnen { // Gerätekontext bereitstellen hdc = BeginPaint(hwnd, &ps); // Größe der zu bearbeitenden Fläche ermitteln GetClientRect(hwnd, &rect); // Text zentriert ausgeben DrawText(hdc, "See you, API World!", -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); // Gerätekontext wieder freigeben EndPaint(hwnd, &ps); // Alles OK return (0); } case WM_DESTROY: // Fenster schließen { // WM_QUIT senden, um Nachrichtenschleife zu beenden PostQuitMessage(0); // Alles OK return (0); } default: { // Aufruf der Standardbehandlungsroutinen für alle anderen // Nachrichten return DefWindowProc(hwnd, message, wParam, lParam); } } } //////////////////////////////////////////////////////////////////////////////// // Funktion: WinMain // Parameter: HINSTANCE hInstance Handle dieser Instanz // HINSTANCE hPrevInstance Handle der letzten, bereits // gestarteten Instanz // lpCmdLine Zeiger auf Kommandozeilen- // parameter // nShowCmd evtl. weitere Aufrufparameter //////////////////////////////////////////////////////////////////////////////// // WndProc ist die Nachrichtenfunktion unseres Programms. Nur WM_PAINT und // WM_DESTROY werden explizit behandelt, für alle weiteren Nachrichten greifen // wir auf die Standardbehandlungsroutinen von Windows zurück //////////////////////////////////////////////////////////////////////////////// // Rückgabewerte: 0 kein Fehler // 1 Fehler beim Registrieren der Fensterklasse //////////////////////////////////////////////////////////////////////////////// int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { // lokale Variablen static char szClassName[] = "MeineErsteFensterKlasse"; // Klassenname WNDCLASSEX wndclassex; // Fensterklassenstruktur MSG msg; // Nachrichtenstruktur HWND hwnd; // Fensterhandle if (!hPrevInstance) { // wndclassex mit Werten füllen wndclassex.cbSize = sizeof(wndclassex); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = hInstance; wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclassex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW); wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = szClassName; // Fensterklasse registrieren if (!RegisterClassEx(&wndclassex)) return (1); } // Fenster erzeugen hwnd = CreateWindowEx(NULL, szClassName, "Mein erstes Windows Fenster", WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // Fenster anzeigen und sofort aktualisieren ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); // Nachrichtenschleife while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // Alles OK return (0); } // ***************************************************************************** // Ende - LISTING1.CPP // *****************************************************************************Fehler:
Fehler 1 error C2664: 'DrawTextW': Konvertierung des Parameters 2 von 'const char [15]' in 'LPCWSTR' nicht möglich g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 45
Warnung 2 warning C4244: 'return': Konvertierung von 'LRESULT' in 'long', möglicher Datenverlust g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 68
Fehler 3 error C2440: '=': 'char [24]' kann nicht in 'LPCWSTR' konvertiert werden g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 114
Fehler 4 error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'char [24]' in 'LPCWSTR' nicht möglich g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 131
-
Bei VS ist standardmäßig unicode eingestellt, d.h. du musst ein L vor die strings setzen: L"Hallo und so"(auch mit _T()). Du könntest zwar unicode ausschalten, aber auf allen WinNT ist es glaube ich besser unicode zu verwenden, da diese das von haus aus an haben, und so ANSI sogar langsamer ist.
-
Dein Programm ist in Visual Studio 2005 auf Unicode Voreingestellt ersetze "text" durch Text("Text") dann dürfte es gehen oder schalte Unicode-Zeichensatz in den Projekt einstellungen ab.
MFG Ascharan

Edit:Ups war zu langsam
:p
-
So kanns im leben gehen :p
-
wo kann ich denn unicode ausstellen? ich bin c++ ja noch am lernen und brauche es nur so für mich. D.h. ich brauche es nicht auf windows nt und so sondern nur auf meinem pc
thx schonmal für die antworten
-
Also hast du noch ein Win98/Me/95?
Und benutzt du VC? Wenn ja Project->Properties->CharactrerSet
-
hab windows xp. und will auf visual studio umsteigen, wenn ich diesen unicode ausstellen kann
-
XP ist ja aber ein NT, also wärs einfacher und besser, wenn du einfach L bzw _T( vor die strings machen würdest...
-
also hab auch xp und schalts auch meistens aus :p
drücke Alt+F7
gehe auf Konfigurationseigenschaften
dann Zeichensatz -> auf Nicht Festgelegt
-
Jeder ist irgendwie gegen Unicode hier

Ich mein das hat doch auch seinen sinn ....
-
Dennis123 schrieb:
Jeder ist irgendwie gegen Unicode hier

Ich mein das hat doch auch seinen sinn ....Binn nich gegen Unicode
nur stürts mich bei Kleineren Projekten :p
-
thx für die antworten. ohne unicode klappt es