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



  • 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.



  • Entschuldige, dass ich erst so spät antworte.
    Ich habe Deine Version übernommen und es funktioniert auch.
    Allerdings flackert die Anwendung kurz auf und wird erst dann beendet.
    Woran kann das liegen?



  • So jetzt flackert nichts mehr auf. Optional kannst Du auch Top und Left der Form auf -5000 setzen

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     ShowWindow(Application->Handle, SW_HIDE);
                     Application->Initialize();
                     Application->ShowMainForm = false;
                     Application->CreateForm(__classid(TForm1), &Form1);
                     Application->Run();
                     ShowWindow(Application->Handle, SW_HIDE);
    
            }
    ...
    


  • Dank Dir für die Hilfe.



  • Gerne wieder.



  • Also, ich weiß nicht, was ihr da macht. Bei mir geht folgendes ohne Probleme:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        try
        {
            if( ParamStr(1) != "-nowindow" )
            {
               Application->Initialize();
               Application->CreateForm(__classid(TForm1), &Form1);
               Application->Run();
            }
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
        return 0;
    }
    

Anmelden zum Antworten