C / c++ Anwendung ohne Win Fenster oder Konsolenfenster
-
Das programm soll nicht sichtbar sein nur im hintergrund laufen. Es ist ein backuptool. In der zeit in der es das backup durchführt will ich die konsole aber nicht sehen.
-
Compiler/IDE ?
-
IDE: Netbeans
Compiler: MinGW also gcc für c
-
Du brauchst auch keine Konsole, du erzeugst ganz einfach ein normales Fenster Projekt und setzt dein Hauptfenster auf SW_HIDE. Ein auf diese Weise erzeugtes Programm ist unsichtbar, im Anwendungsbereich des Taskmanagers ebenfalls, jedoch im Processbereich sichtbar.
-
Es funktioniert nun mit dem Window hide aber es poppt trotzdem noch einen leere Konsole auf. Woran liegt das?
#include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ //ShowWindow (hwnd, nFunsterStil); if(hwnd) { ShowWindow(hwnd, SW_HIDE); ShowWindow(hwnd, SW_HIDE); } /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
-
weil du es als konsolenprojekt kompilierst.
-
Wo kann man das in netbeans ändern?
-
100% funktionieren das ganze nicht. Es wird immer das erzeugte fenster angezeigt und zusätzlich noch eine konsole. In IDEs wie Dev-cpp kann man ein window oder konsolen Projekt erstellen, hier funktioniert das ganze dann, nur in Netbeans suche ich immer noch vergeblich die Einstellung. der Umweg über Dev-cpp ist auf Dauer etwas stressig. Muss man hier vielleicht bestimmte make oder kompiler Parameter übergeben?
-
mache folgendes:
erstelle in neues win32 projekt mit dem assistenten.
Ersetze im main file alles durch folgendes:// testWin.cpp : Defines the entry point for the application. // #include "stdafx.h" #include <windows.h> int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { return 0; }
Aus den ressourceen kannst du auch alles löschen. Die Icon kannst du ja eventuell drin lassen
-
stdafx.h ist bei mri noch nicht vorhanden was ist mit dieser header möglich?
Kann man das ganze nicht so lösen das man dem Kompiler irgendwie klar macht das man keine konsolenanwendung erstellen will?
mfg
-
/ Nchtrag
Habe kein C++ projekt sondern C, stdafx.h ist doch eine header für c++ oder?
-
ok die lösung ist dem linker folgendes Parameter zu übergeben: -mwindows
-
Ich benutze Visual Studio 8 (2005). Kann mir einer sagen wo ich da diesen -mwindows Parameter setzten muss?
Ich will diese blöde Dosbox auch loswerden.
Da man aber trozdem argumente übergeben können muss kommt die Lösung von vlad_tepesch wohl nicht in Frage.
-
Project|Properties|..|Linker|Subsystem: WINDOWS
-
Erzeuge einfach ein ganz normales Win32 Projekt, kein Win32 Konsolen Projekt. Du brauchst dann garkein Fenster erstellen, denn die Nachrichten benötigst du ja schließlih nicht mehr, da du ja auch kein Fenster hast. Wenn du die Nachrichten trotzdem brauchst, lässt du einfach in der Message Loop die TranslateMessage() Funktion weg, und ermittelst die nachrihten indem du direkt die MSG struktur abfragst.
Ich muss aber sagen das ih den anschein habe das du überhaupt keine Ahnung hast was du da eigentlich machst.
Mach besser ein paar Tuts durch und les dir durch was drt steht und versuche es nach zu vollziehen. Niht einfach Kopieren->Einfügen-> Testen ob es geht ...
-
Jochen Kalmbach schrieb:
Project|Properties|..|Linker|Subsystem: WINDOWS
Diese Einstellung habe ich sogar selber genfunden als ich mir alle angeguckt habe. Bringt aber leider zwei Fehler.
Fehler 4 error LNK2001: Nicht aufgelöstes externes Symbol "_WinMain@16". LIBCMTD.lib
Fehler 5 fatal error LNK1120: 1 nicht aufgelöste externe Verweise. G:\...blah0.2.exeCode-Walker schrieb:
Erzeuge einfach ein ganz normales Win32 Projekt, kein Win32 Konsolen Projekt. Du brauchst dann garkein Fenster erstellen, denn die Nachrichten benötigst du ja schließlih nicht mehr, da du ja auch kein Fenster hast. Wenn du die Nachrichten trotzdem brauchst, lässt du einfach in der Message Loop die TranslateMessage() Funktion weg, und ermittelst die nachrihten indem du direkt die MSG struktur abfragst.
Ich muss aber sagen das ih den anschein habe das du überhaupt keine Ahnung hast was du da eigentlich machst.
Mach besser ein paar Tuts durch und les dir durch was drt steht und versuche es nach zu vollziehen. Niht einfach Kopieren->Einfügen-> Testen ob es geht ...
Was soll man dazu sagen?
Viel klugscheisserei aber überhaupt aufs Thema eingegangen?Ich habe bereits ein voll funktionierendes Programm das eine Javaanwendung startet. Das ist auch alles was es machen muss. Zusätzlich müssen aber auch Argumente weitergegeben werden von der .exe an die .jar. Das funktioniert auch. Aber ich brauche keine Dosbox da die Javaanwendung eine Oberfläche hat. Ja ich habe keine Ahnung von der der win Api. Brauch ich momentan auch nicht haben.
Auch wenns manchen schwer fällt. Ich bräuchte Hilfe ohne irgendwelche schwachsinns Belehrungen wie "Nicht einfach Kopieren->Einfügen-> Testen ob es geht ...".
Falls also jemand was mit den Fehlermeldungen anfangen kann oder noch eine andere Lösung hat wäre ich sehr danbar.
-
Du liest einfach nicht, oder?
Alles ist bereits gesagt. vlad_tepesch hat Dir alles gesagt was notwendig ist.
Du hast vermutlich ein main/_tmain in Deinem C Programm. Wenn es ein Windows Programm ist, dann ist der Entry-Point aber WinMain! Und der fehlt.
Das sagt Dir auch der Linker.
-
Ah danke jetzte habe ich es verstanden.
-
Lol! Ich wollte ja bloß helfen ...
-
Zum Thema
Wie bekomme ich jetzt Argumete in mein Program?
Mitint APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
habe ich zwar eine Windowsanwendung aber kein argc und argv mehr. Sind die Argumente in einem von den Parametern drin? Oder ist das nicht möglich?