2016-06-19 4 views
1

Ich habe versucht, ein Fenster Beispiel window.c in C und compiler es in window.exe von gcc auf meinem Fenster 7. Wenn ich window.exe auf der Befehlskonsole ausführen, es funktioniert, aber die Befehlskonsole kann nicht beendet werden, daher kann ich keinen anderen Befehl in derselben Konsole ausführen. Warum? Wenn ich putty.exe oder eine andere Fensteranwendung mit EXE-Erweiterung in der Befehlskonsole ausprobiere, wird die Befehlskonsole beendet, wenn das Programm ausgeführt oder geladen wird. Ob der Grund ist, gibt es keine main() einschließlich in der window.c oder nicht? Und andere Frage ist, warum der Code in der window.c kann im selbst ausgeführten Modus ohne main() einschließlich im Programm ausgeführt werden? Bitte gebenWie C-Fenster-Programm im Hintergrund auf Window 7

#include <windows.h> 

const char g_szClassName[] = "myWindowClass"; 

// Step 4: the Window Procedure 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch(msg) 
{ 
    case WM_CLOSE: 
     DestroyWindow(hwnd); 
    break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
    break; 
    default: 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
} 
return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow) 
{ 
WNDCLASSEX wc; 
HWND hwnd; 
MSG Msg; 

//Step 1: Registering the Window Class 
wc.cbSize  = sizeof(WNDCLASSEX); 
wc.style   = 0; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance  = hInstance; 
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
wc.lpszMenuName = NULL; 
wc.lpszClassName = g_szClassName; 
wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 

if(!RegisterClassEx(&wc)) 
{ 
    MessageBox(NULL, "Window Registration Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

// Step 2: Creating the Window 
hwnd = CreateWindowEx(
    WS_EX_CLIENTEDGE, 
    g_szClassName, 
    "The title of my window", 
    WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT, CW_USEDEFAULT, 600, 300, 
    NULL, NULL, hInstance, NULL); 

if(hwnd == NULL) 
{ 
    MessageBox(NULL, "Window Creation Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

ShowWindow(hwnd, nCmdShow); 
UpdateWindow(hwnd); 

// Step 3: The Message Loop 
while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 
} 
+0

es ist, weil es eine Windows-Anwendung ist. Sie benötigen eine Konsolenanwendung, die ein Fenster erstellt – beyrem

+0

Können Sie uns ein Beispiel geben? Putty.exe ist Konsolenanwendung, richtig? – aabb

Antwort

1

es funktioniert, aber die Befehlskonsole kann nicht verlassen, so kann ich nicht anderen Befehl in der gleichen Konsole ausführen, warum? Wenn ich putty.exe oder eine andere Fensteranwendung mit EXE-Erweiterung in der Befehlskonsole ausprobiere, wird die Befehlskonsole beendet, wenn das Programm ausgeführt oder geladen wird.

Ein Windows-Anwendung aus der Konsole gestartet soll nicht Block weitere Interaktion mit dem Konsolenfenster. Ich weiß nicht wirklich etwas über putty.exe, also verwenden wir notepad.exe als Beispiel. Es ist eine Standard-Windows-Anwendung, also wenn ich es über die Befehlszeile ausführe, wird Notepad in einem neuen Fenster gestartet, und ich bekomme eine C: Eingabeaufforderung zurück. Du hast vollkommen recht damit zu denken, dass das normal ist.

Ihr Code, wie Sie es hier gezeigt haben, würde sich normal verhalten. Etwas anderes ist falsch - möglicherweise Ihre Compiler- oder Linker-Einstellungen. Ich würde vorschlagen, dass Sie möglicherweise auf das Konsolen-Subsystem abzielen, aber dann sollte sich der Linker beschweren, dass Sie den falschen Einstiegspunkt haben. (Zumindest die Toolchain von Microsoft würde es tun; ich bin mir nicht ganz sicher, was GCC betrifft.) Das ist zumindest etwas, was man überprüfen sollte. Stellen Sie sicher, dass Sie beim Erstellen den Schalter -mwindows übergeben.

Ob der Grund ist, gibt es keine main() einschließlich in der window.c oder nicht? Und andere Frage ist, warum der Code in der window.c kann im selbst ausgeführten Modus ohne main() einschließlich im Programm ausgeführt werden?

Nein, das hat nichts damit zu tun. Der Grund dafür, dass es keine main()-Funktion im Code gibt, ist, dass die WinMain()-Funktion als Einstiegspunkt fungiert.

Technisch gesehen ist WinMain() der benutzerdefinierte Einstiegspunkt. Dies ist the conventional name and signature for the function in Windows applications. Sie können es als analog zu main(), aber wirklich, die main() Funktion ist immer noch da, es ist nur in der Bibliothek Code begraben. Die C-Laufzeitbibliotheken, die Sie beim Erstellen einer Windows-Anwendung verknüpfen, definieren den tatsächlichen Einstiegspunkt. Es führt einige frühe Initialisierungsaufgaben aus und ruft dann Ihren benutzerdefinierten Einstiegspunkt WinMain() auf.

Sie können dies in Aktion sehen, wenn Sie Ihre Anwendung unter einem Debugger einzeln ausführen, aber Sie werden es verpassen, wenn Sie den Haltepunkt an der Spitze WinMain() setzen. Obwohl das ist, wo Ihre Code zuerst startet ausgeführt wird, wie ich bereits erklärt habe, gibt es Code, der zuerst ausgeführt wird, bevor Sie die Kontrolle über Ihre WinMain(). Sie müssen also mit der ersten Anweisung in Ihrer EXE beginnen. In Visual Studio würden Sie einfach F11 drücken, um in zu treten. Ich bin mir nicht sicher, welchen Debugger Sie verwenden. Sie müssen die Dokumentation überprüfen.

Oder Sie können sich überhaupt nicht darum kümmern, weil es im Wesentlichen Esoterik ist, die Sie nie wirklich verstehen müssen. Denken Sie einfach an WinMain() als gleichwertig zu main(), wenn Sie eine Windows-Anwendung schreiben!

+0

Vielen Dank für Ihre ausführliche Antwort. Es gibt eine While-Schleife, um die Anwendung weiterhin auszuführen. Ist der Grund, warum die Konsole nicht beendet werden konnte? while (GetMessage (& Msg, NULL, 0, 0)> 0) { Translate (&Msg); Dispatch (&Msg); } – aabb

+0

Nein, das nicht, warum sein kann. Dass die Standard-Windows-Nachrichtenschleife. All Windows-Anwendungen hat es, wie Notepad –

+0

So scheint es der Grund ist relativ zu GCC-Compiler-Problem mit seiner Option – aabb

Verwandte Themen