Linker-Fehler mit dev-cpp [was: frage]
-
techmech schrieb:
[Linker error] undefined reference to `GetStockObject@4'
Gdi32-Bibliothek nicht dazugelinkt.
[Linker error] undefined reference to `WinMain@16'
Vermutlich falscher Projekttyp.
-
Ich würde mal sagen, du hast nicht auf Win32-Fensteranwendung umgestellt, sondern Konsolenprogrammierung. Guck mal bei dir in den Eigenschaften deines Projektes und setz da mal Win32-Fensteranwendung/Windows so was ähnliches halt. Aber NICHT Konsole !
Also MFK hat Recht mit:MFK schrieb:
Vermutlich falscher Projekttyp.
-
jetzt ist es makewin
25 E:\Dev-Cpp\Makefile.win [Build Error] *** multiple target patterns. Stop.
er zeigt mir das dann in der makewin falsch an
ein kleines projekt wird schwerer und schwerer...
$(BIN): $(OBJ)
plz helft
-
jetzt ist es makewin
25 E:\Dev-Cpp\Makefile.win [Build Error] *** multiple target patterns. Stop.
er zeigt mir das dann in der makewin falsch an
ein kleines projekt wird schwerer und schwerer...
$(BIN): $(OBJ)
plz helft
-
ich habe jetzt auf win32 dll gestellt nun habe ich noch das mit dem stock gehabt habe die bibi eingefügt jetzt will er von mir eine host anwendung???
-
arg... wie kann so viel mist in einem Thread stehen?
int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR szCmdLine, int iCmdShow)Jaja.. wie schreibt man WinMain?
nicht WInMain...und dann gibt es da noch sowas wie das MSDN und die haben ne Bilbiothek... s. http://www.msdn.microsoft.com/library/default.asp ... so... da guck man mal nach GetStockObject... mal gucken welche Libs der sagt das man drin haben muss... und welche Header...

-
#include <windows.h> #define IDM_FILE_NEW 40001 #define IDM_FILE_OPEN 40002 #define IDM_FILE_SAVE 40003 #define IDM_FILE_SAVE_AS 40004 #define IDM_APP_EXIT 40005 #define IDM_EDIT_UNDO 40006 #define IDM_EDIT_CUT 40007 #define IDM_EDIT_COPY 40008 #define IDM_EDIT_PASTE 40009 #define IDM_EDIT_CLEAR 40010 #define IDM_BKGND_WHITE 40011 #define IDM_BKGND_LTGRAY 40012 #define IDM_BKGND_GRAY 40013 #define IDM_BKGND_DKGRAY 40014 #define IDM_BKGND_BLACK 40015 #define IDM_TIMER_START 40016 #define IDM_TIMER_STOP 40017 #define IDM_APP_HELP 40018 #define IDM_APP_ABOUT 40019 #define ID_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); TCHAR szAppName[] = TEXT ("MenuDemo"); int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = szAppName; wndclass.lpszClassName = szAppName; hwnd = CreateWindow (szAppName, TEXT ("Menu"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int idColor [5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH }; static int iSelection = IDM_BKGND_WHITE; HMENU hMenu; switch (message) { case WM_COMMAND: hMenu = GetMenu (hwnd); switch (LOWORD(wParam)) { case IDM_FILE_NEW: case IDM_FILE_OPEN: case IDM_FILE_SAVE: case IDM_FILE_SAVE_AS: MessageBeep(0); return 0; case IDM_APP_EXIT: SendMessage (hwnd, WM_CLOSE, 0 ,0); return 0; case IDM_EDIT_UNDO: case IDM_EDIT_CUT: case IDM_EDIT_COPY: case IDM_EDIT_PASTE: case IDM_EDIT_CLEAR: MessageBeep(0); return 0; case IDM_BKGND_WHITE: case IDM_BKGND_LTGRAY: case IDM_BKGND_GRAY: case IDM_BKGND_DKGRAY: case IDM_BKGND_BLACK: CheckMenuItem(hMenu, iSelection, MF_UNCHECKED); iSelection = LOWORD (wParam); CheckMenuItem(hMenu, iSelection, MF_CHECKED); SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) GetStockObject (idColor [LOWORD (wParam) - IDM_BKGND_WHITE])); InvalidateRect (hwnd, NULL, TRUE); return 0; case IDM_TIMER_START: if (SetTimer (hwnd, ID_TIMER, 1000, NULL)) { EnableMenuItem (hMenu, IDM_TIMER_START, MF_GRAYED); EnableMenuItem (hMenu, IDM_TIMER_STOP, MF_ENABLED); } return 0; case IDM_TIMER_STOP: KillTimer (hwnd, ID_TIMER); EnableMenuItem (hMenu, IDM_TIMER_START, MF_GRAYED); EnableMenuItem (hMenu, IDM_TIMER_STOP, MF_ENABLED); return 0; case IDM_APP_HELP: MessageBox (hwnd, TEXT ("Hilfe noch nicht implementiert"), szAppName, MB_ICONEXCLAMATION | MB_OK); return 0; case IDM_APP_\1: MessageBox (hwnd, TEXT ("Menu\n") TEXT ("(c) x,06"), szAppName, MB_ICONINFORMATION | MB_OK); return 0; } break; case WM_TIMER: MessageBeep(0); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }so ich habe das schöne ding ma wieder kompiliert und nun kann ichs auch kompilieren er zeigt aber rein garnix an
-
Du hast da oben definiert:
TCHAR szAppName[] = "...";Versuch's mal mit
const char szAppName[] = "...";Wenn das Prog nämlich die richtige Definition des Namens nicht findet, verweigert es Dir die Registrierung der Fensterklasse.
-
kk habe ich jetzt gemacht aber nun sagt er erstellt er mir einen prozess bei den optionen
win32gui, konsole, statische dll
und bei win32dll sagt er ich muss eine host anwendung konfigurieren unter ausführen menü parameter
-
Wenn das Prog nämlich die richtige Definition des Namens nicht findet, verweigert es Dir die Registrierung der Fensterklasse.
Und noch besser funktioniert die Registrierung einer Fensterklasse, wenn man sie vor
CreateWindow()
mit
RegisterClass()
registriert
-
Jou, da hadder Recht.

Nicht aufgeben, gemeinsam schaffen wir das!
-
if (!RegisterClass (&wndclass)) { MessageBox(NULL,TEXT("Programm basiert auf UNICODE!"), szAppName, MB_ICONERROR); return 0; }das habe ich noch hinzugefügt und habe nun die einstellungen win32gui bernutzt jetzt öffnet er ein standart weißes windows fenster...
-
techmech schrieb:
das habe ich noch hinzugefügt und habe nun die einstellungen win32gui bernutzt jetzt öffnet er ein stan**** weißes windows fenster...
Na, das ist doch was.
Warte mal, aus Deinem Programm entnehme ich, daß Du irgendwo auf ein Menü zugreifen willst, das aber nicht erscheint. Du hast bei"wc.lpszMenuName" = szAppName, keinen Menünamen und keinen Resourcenverweis (LoadMenu(...)) eingegeben. Es fehlt also der Hinweis auf die Resource.
-
wie würde das aussehen ich habe da keine peilung?
und sind rc dateien wichtig?
-
rc-Dateien sind unerläßlich, weil Du darin dem Programm sagst, wie Dein Menü aussehen soll, und mit welchen IDs es angesprochen wird. Die Definition der IDs werden dann noch in einer Header-Datei (meistens "resource.h") eingebunden.
Bei mir sieht das so aus://rc-Datei #include "resource.h" IDM_MENU1 MENU DISCARDABLE { POPUP "&Datei" { MENUITEM "&Öffnen", 102 MENUITEM "&Speichern", 103 MENUITEM SEPARATOR MENUITEM "&Beenden", 108 } POPUP "&Hilfe" { MENUITEM "&Über", 903 } } STRINGTABLE { 102, "Datei öffnen" 103, "Datei Speichern" 108, "Programm Beenden" 903, "Infos zum Programm" }Anmerkung: Mein Prog habe ich mit Borland Resource-Workshop erstellt, daher die Klammern. Du mußt die öffnenden Klammern mit BEGIN und die schließenden mit END ersetzen.
Diese rc-Datei wird mit dem Resourcen-Kompiler (meistens RC.EXE) in eine res-Datei (Binärformat) umgewandelt und beim Linken zum Hauptcode gebunden.Hier die dazu gehörige Header (was Du schon im Hauptprogramm gemacht hast):
//resource.h #define IDM_MENU1 1 #define IDS_STRING_OPEN 102 #define IDS_STRING_SAVE 103 #define IDS_STRING_EXIT 108 #define IDS_STRING_ABOUT 903 #define IDM_FILE_OPEN 102 #define IDM_FILE_SAVE 103 #define IDM_FILE_EXIT 108 #define IDM_HELP_ABOUT 903und eingebunden wird das ganze im Hauptprogramm mit
#include <windows.h> #include "resource.h" //Die " " stehen dafür, daß die .h-Datei in deinem Projekt-Verzeichnis liegt, nicht im Kompiler-Verzeichnis. (...) WNDCLASSEX wc; (...) wc.lpszMenuName = MAKEINTRESOURCE(IDM_MENU1); (...) RegisterClassEx (&wc) //usw...Theoretisch könnte man das alles auch im Hauptprogramm machen, aber dann müßtest Du für jedes neue Projekt das Menü neu zusammenbauen. So hast Du für jedes neue Projekt schon die Grundlagen und brauchst sie nur noch entsprechend zu ändern.
-
aha , jetzt sehe ich das aus ner anderen perspektive. ich habe das programm dem petzold entnommen aber in den rc dateien gibt es noch den include "afxres.h"
was soll das sein???
-
nach meiner meinung ist das jetzt richtig:
Menudemo.cpp:
#include <windows.h> #include "resource.h" #define ID_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); const char szAppName[] = "..."; int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = szAppName; wndclass.lpszClassName = szAppName; if (!RegisterClass (&wndclass)) { MessageBox(NULL,TEXT("Programm basiert auf UNICODE!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow (szAppName, TEXT ("Menu"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int idColor [5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH }; static int iSelection = IDM_BKGND_WHITE; HMENU hMenu; switch (message) { case WM_COMMAND: hMenu = GetMenu (hwnd); switch (LOWORD(wParam)) { case IDM_FILE_NEW: case IDM_FILE_OPEN: case IDM_FILE_SAVE: case IDM_FILE_SAVE_AS: MessageBeep(0); return 0; case IDM_APP_EXIT: SendMessage (hwnd, WM_CLOSE, 0 ,0); return 0; case IDM_EDIT_UNDO: case IDM_EDIT_CUT: case IDM_EDIT_COPY: case IDM_EDIT_PASTE: case IDM_EDIT_CLEAR: MessageBeep(0); return 0; case IDM_BKGND_WHITE: case IDM_BKGND_LTGRAY: case IDM_BKGND_GRAY: case IDM_BKGND_DKGRAY: case IDM_BKGND_BLACK: CheckMenuItem(hMenu, iSelection, MF_UNCHECKED); iSelection = LOWORD (wParam); CheckMenuItem(hMenu, iSelection, MF_CHECKED); SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) GetStockObject (idColor [LOWORD (wParam) - IDM_BKGND_WHITE])); InvalidateRect (hwnd, NULL, TRUE); return 0; case IDM_TIMER_START: if (SetTimer (hwnd, ID_TIMER, 1000, NULL)) { EnableMenuItem (hMenu, IDM_TIMER_START, MF_GRAYED); EnableMenuItem (hMenu, IDM_TIMER_STOP, MF_ENABLED); } return 0; case IDM_TIMER_STOP: KillTimer (hwnd, ID_TIMER); EnableMenuItem (hMenu, IDM_TIMER_START, MF_GRAYED); EnableMenuItem (hMenu, IDM_TIMER_STOP, MF_ENABLED); return 0; case IDM_APP_HELP: MessageBox (hwnd, TEXT ("Hilfe noch nicht implementiert"), szAppName, MB_ICONEXCLAMATION | MB_OK); return 0; case IDM_APP_\1: MessageBox (hwnd, TEXT ("Menu\n") TEXT ("(c) x,06"), szAppName, MB_ICONINFORMATION | MB_OK); return 0; } break; case WM_TIMER: MessageBeep(0); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }Menudemo.rc:
#include "resource.h" #include "afxres.h" MENUDEMO MENU DISCARDABLE BEGIN POPUP "&Datei" BEGIN MENUITEM "&Neu", IDM_FILE_NEW MENUITEM "&Öffnen", IDM_FILE_OPEN MENUITEM "&Speichern", IDM_FILE_SAVE MENUITEM "Speichern &unter", IDM_FILE_SAVE_AS MENUITEM "B&eenden", IDM_APP_EXIT END POPUP "&Bearbeiten" BEGIN MENUITEM "&Widerrufen", IDM_EDIT_UNDO MENUITEM "A&usschneiden", IDM_EDIT_CUT MENUITEM "&Kopieren", IDM_EDIT_COPY MENUITEM "&Einfügen", IDM_EDIT_PASTE MENUITEM "&Löschen", IDM_EDIT_CLEAR END POPUP "&Hintergrund" BEGIN MENUITEM "&Weiß", IDM_BKGND_WHITE, CHECKED MENUITEM "&Hellgrau", IDM_BKGND_LTGRAY MENUITEM "&Grau", IDM_BKGND_GRAY MENUITEM "&Dunkelgrau", IDM_BKGND_DKGRAY MENUITEM "&Schwarz", IDM_BKGND_BLACK END POPUP "&Timer" BEGIN MENUITEM "&Start", IDM_TIMER_START MENUITEM "S&top", IDM_TIMER_STOP, GRAYED END POPUP "&Hilfe" BEGIN MENUITEM "&Hilfe...", IDM_APP_HELP MENUITEM "I&nfo über MenuDemo...", IDM_APP_ABOUT END ENDresource.h:
#define IDM_FILE_NEW 40001 #define IDM_FILE_OPEN 40002 #define IDM_FILE_SAVE 40003 #define IDM_FILE_SAVE_AS 40004 #define IDM_APP_EXIT 40005 #define IDM_EDIT_UNDO 40006 #define IDM_EDIT_CUT 40007 #define IDM_EDIT_COPY 40008 #define IDM_EDIT_PASTE 40009 #define IDM_EDIT_CLEAR 40010 #define IDM_BKGND_WHITE 40011 #define IDM_BKGND_LTGRAY 40012 #define IDM_BKGND_GRAY 40013 #define IDM_BKGND_DKGRAY 40014 #define IDM_BKGND_BLACK 40015 #define IDM_TIMER_START 40016 #define IDM_TIMER_STOP 40017 #define IDM_APP_HELP 40018 #define IDM_APP_ABOUT 40019aber trotzdem will er mir die menüpunkte nicht anzeigen
-
Das Menü wurde sehr wahrscheinlich ncht geladen, füge nach dem CreateWindow() noch einen LoadMenu()-Aufruf ein. Hoffentlich hilft dies.
-
GetMenu (hwnd);
und
LoadMenu(hInstance,szCmdLine)funzen net
-
Hallo, Techmech
Du hast bei "Wndclass.lpszMenuName" immer noch "szAppName" stehen. szAppName ist kein Menü. Da muß MAKEINTRESOURCE() stehen (siehe mein Code oben im letztn Posting).