Win32 Konsolenanwendung mit MFC oder WinAPI



  • Hallo,

    ich versuche seit einigen Tagen eine Konsolenanwendung zu erstellen, die jedoch auch eine Grafische Oberfläche hat...
    Also zum einen kann man ja Befehle wie "Create" benutzen, andererseits wäre es auch schön einen Dialog einzubinden...
    Um den einzubinden muss ich MFC mit einbinden, und da MFC die Function DllMain benutzt, kann ich die dann jedoch nicht mehr benutzen.
    Danach habe ich schon gesucht und herausgefunden, dass man die "dllmodul.cpp" mit einbinden muss, sodass man die sachen die man bei DLL_PROCESS_ATTACH machen will, da einfügt...
    Funtkioniert auch, bis auf einen Fehler: DELETE_EXCEPTION(e) -> bezeichner nicht gefunden
    Wenn man das einfach rausnimmt, geht es... Aber wie öffne ich dann die Dialogbox?
    Hat jemand vielleicht eine einfachere lösung? zB mit WinAPI?
    Oder noch ganz andere Vorschläge?
    Also was ich brauche ist einfach eine dll mit DllMain Function, und dazu möchte ich dann eben eine Konsole und eine grafische Oberfläche.
    Hoffe ihr könnt mir ein paar Tipps geben, danke jetzt schonmal!

    mfG
    Tidus47



  • WinApi-Lösung:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	//Neues Konsolenfenster erstellen
    	AllocConsole();
    
        //IO wieder in Konsole lenken
        freopen("CONIN$", "r", stdin);
    	freopen("CONOUT$", "w", stdout);
    	freopen("CONOUT$", "w", stderr);
    }
    

    Allerdings ist das evtl. noch nicht alles.
    Wenn du nicht möchtest, dass dein Programm sofort beendet wird, wenn man die Konsole schließet, solltest du das evtl. auch verhindern etc...

    Der folgende Code macht folgendes:
    - Erstellt eine neue Konsole
    - Lenkt den IO wieder in die Konsole
    - Graut das "Schließen"-Menuitem der Konsole aus
    - Verhindert das Schließen per Alt+F4 / Strg+C / Strg+Pause
    - Zentriert die Konsole

    #define _WIN32_WINNT 0x0500
    #include <tchar.h>
    #include <windows.h>
    
    void InitializeConsole(void);
    BOOL WINAPI HandlerRoutine(DWORD dwCtrlType);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        InitializeConsole();
    
        //...
    
        return 0;
    }
    
    void InitializeConsole(void)
    {
    	// Neue Konsole erstellen
    	AllocConsole();
    
        // Handle von Konsolenfenster
    	HWND hWnd = GetConsoleWindow();
    
    	ShowWindow(hWnd, SW_HIDE);
    
    	// Neuen Eventhandler für Konsole festlegen
    	SetConsoleCtrlHandler((PHANDLER_ROUTINE)HandlerRoutine, TRUE);
    
    	// Konsole als Standard-IO festlegen
    	freopen("CONIN$", "r", stdin);
    	freopen("CONOUT$", "w", stdout);
    	freopen("CONOUT$", "w", stderr);
    
    	// Systemmenu wiederhestellen (wie bei normalem Fenster)
    	GetSystemMenu(hWnd, TRUE);
    
    	// Handle vom Systemmenü
    	HMENU hSysMenu = GetSystemMenu(hWnd, FALSE);
    
    	// Schließenbutton deaktivieren
    	EnableMenuItem(hSysMenu, SC_CLOSE, MF_GRAYED);
    
    	// Fensterkoordinaten
    	RECT rect;
    	GetWindowRect(hWnd, &rect);
    
    	// Fenstergröße
    	int width = rect.right - rect.left;
    	int height = rect.bottom - rect.top;
    
    	// Zentrierte Fenster position
    	int left = GetSystemMetrics(SM_CXSCREEN) / 2 - width / 2;
    	int top = GetSystemMetrics(SM_CYSCREEN) / 2 - height / 2;
    
    	// Fenster zentriert plazieren
    	SetWindowPos(hWnd, NULL, left, top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
    
    	ShowWindow(hWnd, SW_SHOW);
    }
    
    BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
    {
    // Schließen der Konsole abfangen
    
    	switch(dwCtrlType)
    	{
    		case CTRL_C_EVENT:
    			break;
    		case CTRL_BREAK_EVENT:
    			break;
    		case CTRL_CLOSE_EVENT:
    			break;
    	}
    
    	return TRUE;
    }
    

    Gruß
    Fabian



  • Danke erstmal!

    Also das schließen ist ganz gut so, dass das Programm dann sofort mit zu geht.
    WinMain is dann die Api oder?
    Werde es morgen nochmal genauer durchlesen, erstmal noch Deutschland feiern jetzt 😃
    Danke nochmals, Tidus47



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Was macht der Befehl AllocConsole?
    Irgendwie öffnet bei mir keine Konsole, nur wenn ich nen anderen Befehl nehme (InitConsole)... hmm 😕



  • Doch geht, sry für Doppelpost aber bin noch nicht angemeldet hier... Sollte ich vielleicht mal tun...
    Weitere Frage: Wann wird die WinMain function aufgerufen bzw wie kann ich das machen? Bin noch relativ neu in c++ 😃



  • "If you choose "Win32 Application" you will be required to have a WinMain function. The system automatically calls this function for you when your program starts."
    Nee, passiert bei mir nicht... O.o



  • Okay...
    letzlich funktioniert alles...
    Wie kann ich jetzt Labels machen? Muss man das alles per Source machen oder kann man auch iwie .rc erstellen und da mit der Toolbox arbeiten?
    Danke schonmal 😉



  • Du kannst auch mit Resourcen arbeiten...
    (Ich persönlich code GUI aber am liebsten ohne diese, da mich die DialogUnits nerven :D)

    Wenn du VS Std. oder höher verwendest ist ja einer integriert.

    Bei VS Expr. oder anderen IDEs ohne Resource Editor würde ich dir ResEdit empfehlen:

    Bsp: http://www.codeproject.com/KB/cpp/resedit.aspx



  • Dann höre ich auf dich, wie kann ich das alles selbst coden? Hast du eine gute Seite wo es zB Alle Buttons gibt oder sowas? Also alle möglichkeiten dann meinem Window "hWnd" sachen einzufügen...
    und wie kann ich das machen dass die größe unveränderbar ist? xD
    wcex.style = CS_HREDRAW | CS_VREDRAW; << hier ne? aber welcher ist dafür? danke



  • //nachtrag:
    Habe ein Paar Buttons usw erstellt, aber gibt es da wirklich nur diese 7 oder was das is Befehle für CreateWindow("BUTTON") etc.?
    Die sehen so Windows NT mäßig aus, wie kann ich das ändern?
    Danke nochmals für die Hilfe 🙂



  • //ich sollte vllt nich so viel spammen 😞
    Naja, beiträge zählen ja eh nicht^^
    :::

    habe jetzt son gui gemacht, buttons sehen gut aus, wenn ich die anklicke siehts halbwegs wie "angeklickt" aus...
    mit .rc datein sieht alles einfacher aus, aber nun will ich so machen...
    bei mir meckert der zur zeit rum, wenn ich getprivate profile string mache, dass es "name" ist -> kann nich in LPWSTR oder so konvertiert werden...
    bei meiner alten dll ging das, geht wegen ascii usw nicht, wie krieg ich das hin dass ich nich TEXT("name") eingeben muss ? 😞


Log in to reply