Probleme mit VC++ Express Edition



  • hi,
    ich wollte nun von KonsolenAnwendungen auf WindowsAnwendungen umsteigen und hab dazu Microsoft Visual c++ Express Edition installiert und auch die Plattform SDK!
    (nach Anleitung auf http://www.germangamedev.de/index.php?site=article&id=28)
    Nun hab ich mir folgende Tutorials angeschaut
    http://pronix.linuxdelta.de/C/win32/win32_1.shtml
    http://www.henkessoft3000.de/
    bekomme jedoch beim Erstellen des Hello World Programm folgende Fehlermeldung:

    1>d:\visual studio 2005\projects\hello world\hello world\main.cpp(25) : error C2440: '=': 'LPCSTR' kann nicht in 'LPCWSTR' konvertiert werden
    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>d:\visual studio 2005\projects\hello world\hello world\main.cpp(26) : error C2440: '=': 'LPCSTR' kann nicht in 'LPCWSTR' konvertiert werden
    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>d:\visual studio 2005\projects\hello world\hello world\main.cpp(43) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'LPCSTR' 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>d:\visual studio 2005\projects\hello world\hello world\main.cpp(56) : warning C4244: 'return': Konvertierung von 'WPARAM' in 'int', möglicher Datenverlust

    Beim Beispielprogramm des anderen Tutorial kommt eine ähnliche Fehlermeldung (auch falscher Typ)!

    Hier ist der Code:

    #include <windows.h>

    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

    LPCSTR lpszAppName = "AppName";
    LPCSTR lpszTitle = "Meine erste Applikation";

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {

    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszClassName = lpszAppName;
    wc.lpszMenuName = lpszAppName;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if( RegisterClassEx(&wc) == 0)
    return 0;

    hWnd = CreateWindowEx(NULL,
    lpszAppName,
    lpszTitle,
    WS_OVERLAPPEDWINDOW,
    0,
    0,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL);

    if( hWnd == NULL)
    return 0;

    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }

    LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam)
    {
    switch (umsg)
    {
    case WM_DESTROY:
    {
    PostQuitMessage(0);
    return 0;
    }
    }
    return DefWindowProc(hWnd, umsg, wParam, lParam);
    }

    Woran könnte das liegen? Hab ich evt. doch etwas falsch installiert?



  • Du hast wahrscheinlich in den Projekteigenschaften Unicode eingestellt, dein Code ist aber für MultiByte...
    projekt->Eigenschaften->Allgemein->Projektstandarts->Zeichensatz->MultiByte-Zeichensatz verwenden



  • Du versuchst als UNICODE zu kompilieren. Du kannst entweder in den Projekt Einstellungen UNICODE Kompilierung abstellen oder du ersetzt die LPCSTR mit LPCTSTR und benutzt das _T() oder _TEXT() makro für die Zeichenketten.



  • Vielen Dank, jetzt funktioniert alles!

    Ist die Warnung
    1>d:\visual studio 2005\projects\hello world\hello world\main.cpp(56) : warning C4244: 'return': Konvertierung von 'WPARAM' in 'int', möglicher Datenverlust

    denn schlimm oder kann ich die einfach ignorieren?



  • Nein, zumindest sagt die Doku ja, dass dies so gemacht werden soll. Mach halt einen Cast

    return (int) msg.wParam;
    

    und dann gibt sich dein Compiler damit zufrieden.


Anmelden zum Antworten