Per Parameter die Exe-Datei anweisen, dass das Fenster nicht geöffnet werden soll?



  • Hallo ihr,

    c++ ist nicht meine Stärke. Ich suche nach einer Möglichkeit meiner EXE-Datei per Parameter zu vermitteln, dass es das Fenster nicht öffnen soll, und stattdessen nur eine Methode zu durchlaufen hat.

    Meine Vorstellung so:

    main.exe -nowindow
    

    Jetzt weiß die Anwendung, dass das Fenster nicht geöffnet werden soll.
    Gibt es hierfür eine bestimmte Klasse oder Methode innerhalb von Application?

    Vielen Dank erstmal!



  • arbeitest du mit einer grafischen oberfläche oder nur eine konsolenanwendung?



  • Die Anwendung ist grafisch. Die GUI soll bei einem normalen Klick auf die .exe-Datei angezeigt werden. Wenn aber der Parameter übergeben wird, soll die Anwendung nur eine Methode durchlaufen und sich danach wieder beenden, also ohne die GUI anzuzeigen.



  • Es gibt da 2 Möglichkeiten:

    1.) In WinMain die Parameter abfragen

    2.) In Konstruktor der MainForm (oder im OnCreate) prüfen, ob in ParamStr(1) der Wert "-nowindow" steht.

    Ich bin für Möglichkeit 1.



  • Hallo

    öffne deine Projekt-Codedatei ansich (die cpp die den selben Namen hat wie deine bpr, und in der die WinMain-Funktion steht.
    Dort kannst du nach dem Application->Initialize() und vor dem ->CreateForm, ...->Run mitttels ParamStr die Kommandoparameter auswerten und entsprechend den Programmablauf beeinflußen.

    /Edit : zu langsam...

    bis bald
    akari



  • ParamStr wird bei mir nicht angezeigt. Muss ich da noch was einbinden?



  • zoufahl schrieb:

    ParamStr wird bei mir nicht angezeigt.

    Was meinst du damit?



  • ParamStr wird mir innerhalb von Application nicht angezeigt.
    Ist aber auch logisch. Gehört ja schließlich auch nicht in Application rein.

    Jetzt habe ich aber folgendes gemacht:

    if(LowerCase(ParamStr(1)) == "-nowindow")
    {
            	// nichts tun
    }
    else
    {
            	Application->Initialize();
             Application->CreateForm(__classid(TForm1), &Form1);
             Application->Run();
    }
    

    Wenn ich aber aus der Console heraus die Anwendung starte und ihr dabei den Parameter -nowindow übergebe, wird die GUI trotzdem angezeigt. Sollte doch nicht sein, oder ?



  • laut Deinem Code dürfte das Programm bei nowindow-Übergabe eigentlich überhaupt nicht initialisiert werden 😕

    Du musst das später abfangen und dann das Fenster verbergen



  • Besteht der EXE-Dateiname evtl. aus mehreren Wörtern?



  • Komischerweise geht es, wenn ich LowerCase(...) aus der IF-Abfrage rausnehme.
    Die Anwendung wird kurz im Taskmanager angezeigt und verschwindet dann wieder.
    Allerdings kann ich nicht auf öffentliche Methoden innerhalb der Form zugreifen, so dass ich die Implementierung wohl doch im OnFormCreate-Event durchführen muss.
    Aber selbst dann will ich nicht, dass das Fenster angezeigt wird.



  • Dann schreibe doch in WinMain

    ShowWindow(Application->Handle, SW_HIDE);
    

    und fang in onCreate den Übergabeparameter ab, um dann das Fenster anzuzeigen oder nicht.



  • Funktioniert nicht. Das Fenster wird mit trotzdem angezeigt.
    Aber ich habe das jetzt so gelöst, dass ich im OnFormCreate-Event den Parameter abfange, danach meine Methode ausführe, und gleich danach mit delete(this) die Anwendung "beende".
    Das geht soweit auch, nur wird mir dann eine EAccessViolation geworfen.
    Free() soll ich laut Hilfe nicht verwenden, da es in delete(...) schon vorhanden ist.
    Wie bekomme ich aber jetzt die Fehlermeldung weg?



  • normalerweise müsstest Du da mit try/catch arbeiten. Das ganze erscheint mir aber trotzdem ziemlich gefrickelt.

    //Edit
    habe nochmal geschaut. Mit Application->ShowMainForm kannst Du festlegen, ob die MainForm zum Start angezeigt wird.



  • Das ist auch gefrickelt. Ist schließlich auch meine erste C++ Anwendung. Aber darum geht es nicht.
    Ich habe jetzt einen Try-Catch-Block drum herum geschrieben. Die Fehlermeldung wird trotzdem angezeigt. Allerdings habe ich auch einen Try-Catch-Block in der WinMain, bei dem ich fast der Meinung bin, dass der Fehler erst in der WinMain abgefangen wird, und dann erst im OnFormCreate.
    Wie die Exception-Geschichte in C++ funktioniert habe ich mir bisher noch nicht angeschaut. Allerdings sollte der Abfang doch genau so funktionieren wie in C# oder Java. Oder irre ich mich da?



  • Ja, funktioniert genau wie in Java.
    Im Builder werden aber immer alle Fehlermeldungen angezeigt. Die musst das Programm manuell z.B. aus dem Explorer heraus starten, um zu sehen, ob es funktioniert.



  • Die Anwendung wird aus der Konsole heraus gestartet, damit ich den Parameter anhängen kann. Trotzdem kommt die Fehlermeldung.



  • Ins blaue hinein raten bringt nichts. Poste am besten mal ein wenig Quellcode.



  • Die WinMain hat folgendes:

    try
    	{
    		Application->Initialize();
                    Application->CreateForm(__classid(TForm1), &Form1);
                    Application->ShowMainForm = false;
    		Application->Run();
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	catch (...)
    	{
    		try
    	    	{
    	      		throw Exception("");
                    }
    		catch (Exception &exception)
    		{
    			Application->ShowException(&exception);
    		}
    	}
    	return 0;
    

    und der Event OnFormCreate hat

    if(ParamStr(1) == "-nowindow")
            {
                    try
                    {
            	ShowMessage(AnsiString(ParamStr(1)));
                    PCWatchVorbereiten();
                    delete(this);
                    }
                    catch(EAccessViolation &e)
                    {
                    	// nichts tun
                    }
            }
            else
            {
            	this->Show();
            }
    


  • so habe das Ganze mal bei mir ein wenig geändert und compiliert:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     Application->Initialize();
                     Application->CreateForm(__classid(TForm1), &Form1);
                     Application->Run();
                     ShowWindow(Application->Handle, SW_HIDE);
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
    ...
    

    und

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
         if(ParamStr(1) == "test")
           {
             try
               {
                 ShowMessage(AnsiString(ParamStr(1)));
                 //DoSomething()
                 Application->Terminate();
               }
             catch(...) { }
           }
         else
            Form1->Visible = true;
    }
    

    Funktioniert fehlerfrei und die Hauptform wird nicht angezeigt.


Log in to reply