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...