Winapi in dll



  • Huhu 🙂
    ich wollte ein WinApi Fenster in meine DLl kompilieren.
    Leider bekomme ich dabei foldende Fehler:
    ld returned 1 exit status [Linker error] undefined reference to `WndProc@16'
    [Build Error] [DestinyDLL.dll] Error 1
    Habt ihr vielleicht eine Ahnung warum das nicht klappt?
    Muss ich vielleicht noch was Linken?
    Danke 🙂

    #define _WIN32_WINNT 0x0501
    #include <windows.h>
    #include <iostream>
    #include <string>
    #define ID_BUTTON1 11001
    #define ID_BUTTON2 11002
    #define ID_CHECKBOX 11003
    #define ID_AUSWAHL1 11004 
    #define ID_AUSWAHL2 11005
    #define ID_AUSWAHL3 11006
    #define ID_AUSWAHL4 11007
    #define ID_AUSWAHL5 11008
    #define ID_AUSWAHL6 11009
    #define ID_AUSWAHL7 11010
    #define ID_AUSWAHL8 11011
    #define ID_AUSWAHL9 11012
    
    using namespace std;
    extern "C" void __declspec(dllexport) Funktion()
    {
    
    //std::string szAntwort = "Du hast Auswahl 1 getroffen und einen Haken gesetzt! \n";
    
    //int g_iWort = 0;
    //int g_iAusw = 0;
    
    //void szSatz(int iAusw, int wort);
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    //int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
     //                  PSTR szCmdLine, int iCmdShow)
    //{
            int iCmdShow;
           HINSTANCE hInstance;              
           HWND         hWnd;
           HWND         hButton, hButton2, hGroupbox, hAuswahl1, hAuswahl2, hAuswahl3, hAuswahl4, hAuswahl5, hAuswahl6, hAuswahl7, hAuswahl8, hAuswahl9, hCheckbox;
           MSG          msg;
           WNDCLASSEX   wc;
    
           // WindowClass definieren
            wc.cbSize          = sizeof(WNDCLASSEX);
            wc.style           = CS_CLASSDC;
            wc.lpfnWndProc     = WndProc;
            wc.cbClsExtra      = 0;
            wc.cbWndExtra      = 0;
            wc.hInstance       = hInstance;
            wc.hIcon           = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
            wc.hIconSm         = wc.hIcon;
            wc.hCursor         = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_ARROW));
            wc.hbrBackground   = GetSysColorBrush(COLOR_3DFACE);
            wc.lpszMenuName    = NULL;
            wc.lpszClassName   = "Fenster";
    
           // WindowClass registreiren
            RegisterClassEx(&wc);
    
           // Fenster definieren
            hWnd = CreateWindow("Fenster",
                           "",
                           WS_CAPTION | WS_SYSMENU,
                           0,          /* X-Position auf dem Monitor */
                           0,          /* Y-Position auf dem Monitor */
                           240,                    /* Fensterbreite              */
                           300,                    /* Fensterhoehe               */
                           NULL,
                           NULL,
                           hInstance,
                           NULL);
    
           // Button 1
            hButton = CreateWindow("BUTTON",
                           "About",
                           WS_VISIBLE | WS_CHILD ,
                           110, 15,
                           75, 25,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
            //if(!hButton) return FALSE;
    
            // Button 2
            hButton2 = CreateWindow("BUTTON",
                           "Abbrechen",
                           WS_VISIBLE | WS_CHILD ,
                           110, 45,
                           75, 25,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
           // if(!hButton2) return FALSE;
    
            // Auswahl 1
            hAuswahl1 = CreateWindow("BUTTON",
                           "F1",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 30,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
           // if(!hAuswahl1) return FALSE;
    
            // Auswahl 2
            hAuswahl2 = CreateWindow("BUTTON",
                           "F2",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 50,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
           // if(!hAuswahl2) return FALSE;
    
            // Auswahl 3
            hAuswahl3 = CreateWindow("BUTTON",
                           "F3",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 70,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
           // if(!hAuswahl3) return FALSE;
    
                    // Auswahl 4
            hAuswahl4 = CreateWindow("BUTTON",
                           "F4",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 90,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
            //if(!hAuswahl4) return FALSE;
    
            hAuswahl5 = CreateWindow("BUTTON",
                           "F5",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 110,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
            //if(!hAuswahl5) return FALSE;
    
                    hAuswahl6 = CreateWindow("BUTTON",
                           "F6",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 130,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
           // if(!hAuswahl6) return FALSE;
    
                    hAuswahl7 = CreateWindow("BUTTON",
                           "F7",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 150,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
          //  if(!hAuswahl7) return FALSE;
    
                    hAuswahl8 = CreateWindow("BUTTON",
                           "F8",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 170,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
            //if(!hAuswahl8) return FALSE;
    
                    hAuswahl9 = CreateWindow("BUTTON",
                           "F9",
                           WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,
                           20, 190,
                           90, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
           // if(!hAuswahl9) return FALSE;
    
            // Checkbox
            hCheckbox = CreateWindow("BUTTON",
                           "Sound",
                           WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,
                           110, 85,
                           100, 20,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
           // if(!hCheckbox) return FALSE;
    
            // Groupbox
            hGroupbox = CreateWindow("BUTTON",
                           "Optionen",
                           WS_VISIBLE | WS_CHILD | BS_GROUPBOX,
                           10, 10,
                           80, 210,
                           hWnd,
                           NULL,
                           hInstance,
                           NULL);
          //  if(!hGroupbox) return FALSE;
    
                    //ID's vergeben
                    SetWindowLong( hButton, GWL_ID, ID_BUTTON1 );
                    SetWindowLong( hButton2, GWL_ID, ID_BUTTON2 );
                    SetWindowLong( hCheckbox, GWL_ID, ID_CHECKBOX );
                    SetWindowLong( hAuswahl1, GWL_ID, ID_AUSWAHL1 ); 
                    SetWindowLong( hAuswahl2, GWL_ID, ID_AUSWAHL2 ); 
                    SetWindowLong( hAuswahl3, GWL_ID, ID_AUSWAHL3 ); 
                    SetWindowLong( hAuswahl4, GWL_ID, ID_AUSWAHL4 ); 
                    SetWindowLong( hAuswahl5, GWL_ID, ID_AUSWAHL5 ); 
                    SetWindowLong( hAuswahl6, GWL_ID, ID_AUSWAHL6 ); 
                    SetWindowLong( hAuswahl7, GWL_ID, ID_AUSWAHL7 ); 
                    SetWindowLong( hAuswahl8, GWL_ID, ID_AUSWAHL8 ); 
                    SetWindowLong( hAuswahl9, GWL_ID, ID_AUSWAHL9 ); 
    
            // Die Schrift setzen
            SendMessage(hButton, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hButton2, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl1, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl2, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl3, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl4, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl5, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl6, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl7, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl8, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hAuswahl9, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hCheckbox, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
            SendMessage(hGroupbox, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
    
            // Fenster aqnzeigen lassen
             ShowWindow(hWnd, iCmdShow);
             UpdateWindow(hWnd);
    
            // Diese while-Schleifen da...
                while (GetMessage(&msg, NULL, 0, 0))
                {
                          TranslateMessage(&msg);
                          DispatchMessage(&msg);
                }
    
            // Ende der WinMain
               //return msg.wParam;
    }
    
    // Callback
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
       switch (message)
       {
    
       case WM_CREATE:
       // Das Fenster wurde erstellt.
       break;
       case WM_COMMAND:      
       switch( LOWORD( wParam ) )
                {
                            // OK Button
                            case ID_BUTTON1:
                            if (HIWORD(wParam) == BN_CLICKED)
                            // Satz ändern
                            //szSatz(g_iAusw, g_iWort);
                            // Messagebox ausgeben
                            MessageBox(NULL, "",
                            "Danke für das Nutzen des Programmes",
                            MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
                            // Programm beenden
                            //SendMessage(hWnd, WM_CLOSE, 0, 0);
                            break;
    
                            // Abbrechen Button
                            case ID_BUTTON2:
                            if (HIWORD(wParam) == BN_CLICKED)
                            SendMessage(hWnd, WM_CLOSE, 0, 0);
                            break;
    
                            // CheckBox
                            case ID_CHECKBOX:
                            if (BST_CHECKED == SendMessage( ( HWND )lParam, BM_GETCHECK, 0, 0 ))
                            //g_iWort = 1;
    
                            break;
    
                            // Auswahl 1
                            case ID_AUSWAHL1:
                            if (BST_CHECKED == SendMessage( ( HWND )lParam, BM_GETCHECK, 0, 0 ))
                            Beep(1000,3000);
                            break; 
    
                            // Auswahl 2
                            case ID_AUSWAHL2:
                            if (BST_CHECKED == SendMessage( ( HWND )lParam, BM_GETCHECK, 0, 0 ))
                            //g_iAusw = 2;
                            break;
    
                            // Auswahl 3
                            case ID_AUSWAHL3:
                            if (BST_CHECKED == SendMessage( ( HWND )lParam, BM_GETCHECK, 0, 0 )) 
                            //g_iAusw = 3;
                            break;
                }          
    
                                    break;
    
             case WM_DESTROY:
                            {
                             PostQuitMessage(0);
                             return 0;
                            }
       }
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    //system("PAUSE");
    
    BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
       return TRUE;
    }
    

    😃



  • Was ist denn das...
    1. reduziere den Code auf das Wesentliche, keiner hat lust sich so viel durchzulesen.
    2. Du schreibst den Prototyp von WndProc IN Funktion(). Tue ihn davor deklarieren.
    3. mache das, dann sieht man sich wieder :).



  • Hi,

    du hast die WinMain Funktion auskommentiert. So findet der Compiler auch keinen Einstiegspunkt. Tu mal die folgenden Kommentarzeilen incl. aller dazugehöriger Klammern wieder weg: (Also lediglich die zwei // wegmachen):

    //int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
     //                  PSTR szCmdLine, int iCmdShow)
    

    usw. ...



  • mikey schrieb:

    du hast die WinMain Funktion auskommentiert. So findet der Compiler auch keinen Einstiegspunkt.

    ...er hat doch geschrieben dass es eine Dll-Datei ist. Und eine _DllMain_ hat er!



  • hi, ich hab den callback jetzt vorher deklariert danke:

    using namespace std; 
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
    
    extern "C" void __declspec(dllexport) Funktion() 
    {
    

    Leider weiß ich nicht was bei dem Code das wesentliche ist
    da ich ja Linker error bekomme und keine Zeile in der sich der Fehler befindet...



  • ...er hat doch geschrieben dass es eine Dll-Datei ist. Und eine _DllMain_ hat er!

    Ups, hab's zu flüchtig überlesen... 🙂



  • wenn ich den code in einem normalen windows projekt
    kompiliere geht es ja...


Anmelden zum Antworten