WinApi Anfängerproblem



  • Hallo, ich schreibe mit Visual C++ 2005 Express Edition folgenden copierten Code:

    #define STRICT
    #include <windows.h>

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

    LPCSTR lpszAppName = "First_USB_API";
    LPCSTR lpszTitle = "Meine erste Windows 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);
    }

    und bekomme beim Build folgende Fehler Meldung:

    Compiling...
    First_USB_API.cpp
    Linking...
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__PostQuitMessage@4 referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__DefWindowProcA@16 referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__DispatchMessageA@4 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__TranslateMessage@4 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__GetMessageA@16 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__UpdateWindow@4 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__ShowWindow@8 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__CreateWindowExA@48 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__RegisterClassExA@4 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__GetStockObject@4 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__LoadIconA@8 referenced in function _WinMain@16
    First_USB_API.obj : error LNK2019: unresolved external symbol __imp__LoadCursorA@8 referenced in function _WinMain@16
    C:\Dokumente und Einstellungen\Peer\Eigene Dateien\Visual Studio 2005\Projects\Test exe\Debug\Test.exe : fatal error LNK1120: 12 unresolved externals

    Was habe ich da falsch gemacht? habe ich irgendwas wichtiges im Linker nicht eingestellt?

    Gruß Peer



  • Ich würde mal sagen, da fehlt 'ne Library - schau am besten mal in der Hilfe zu den angemeckerten Funktionen nach, welche Bibliothek du dem Linker mitgeben sollst und trage diese mit in die Projekteinstellungen ein.



  • wichtig is kernel32.lib user32.lib und gdi32.lib

    is bei vcexpress nicht standardmäßig inkludiert



  • kernel.lib, user.lib und gdi.lib sind Bestandteile von Windows und werden beim Kompilieren automatisch eingebunden.

    HWND hWnd;
    MSG msg;//Hier heißt die Message msg
    WNDCLASSEX wc; 
    (....)
    (....)
    LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam)
    {
    switch (umsg)//Hier heißt die Message umsg, die ist aber nicht definiert.
    {
    

    Siehe oben: die Nachricht umsg ist nicht definiert. Stattdessen hast Du MSG msg definiert.



  • Siehe oben: die Nachricht umsg ist nicht definiert. Stattdessen hast Du MSG msg definiert.

    Quatsch. Er kommt umsg als Aufrufparameter in der Callback-Prozedur übergeben und wertet diesen auch aus.



  • Elektronix schrieb:

    kernel.lib, user.lib und gdi.lib sind Bestandteile von Windows und werden beim Kompilieren automatisch eingebunden.

    Nope, davon kannst du nicht ausgehen. Welche Libs automtisch beim Linken berücksichtigt werden, hat VC in irgendwelchen Textfiles hinterlegt. Und das variiert von Version zu Version der IDE. Bei VC++ 2005 EE dürfte das zB lediglich kernel32.lib sein.



  • Hast du ausversehen ein Konsolenprojekt angelegt?



  • 🙂 jep haben die usert32.lib und die gdi32.lib gefehlt, jetzt klappt es.

    Danke Peer



  • Nightstorm schrieb:

    🙂 jep haben die usert32.lib und die gdi32.lib gefehlt, jetzt klappt es.

    jaja usert32, nicht mal schreiben kann ich.

    user32.lib meint ich natürlich

    Peer


Anmelden zum Antworten