command_line auch im programmverwenden


  • Mod

    CStoll schrieb:

    Wo soll das denn gehen? argv und argc sind lokale Parameter der main()-Funktion.

    und __argc und __argv sind globale Variablen der CRT. 😉



  • Martin Richter schrieb:

    und __argc und __argv sind globale Variablen der CRT. 😉

    Und von welchem Compiler sprechen wir hier? Zum ANSI-Standard gehören die auf jeden Fall nicht - und ich würde mich notfalls auch nicht darauf verlassen, daß sie in der nächsten Compiler-Version noch existieren.


  • Mod

    CStoll schrieb:

    Martin Richter schrieb:

    und __argc und __argv sind globale Variablen der CRT. 😉

    Und von welchem Compiler sprechen wir hier? Zum ANSI-Standard gehören die auf jeden Fall nicht - und ich würde mich notfalls auch nicht darauf verlassen, daß sie in der nächsten Compiler-Version noch existieren.

    Diese Variablen gehören zur CRT der MS Versionen des C 5.0 Compilers, also ca. seit 1987.
    Korrekt sie sind nicht ANSI, leicht zu erkennen am doppelten Underbar.



  • Sieht nach nem Borland Builder aus, richtig?

    Mach folgendes:

    #include "Main.h"   <--- Header deines Hauptformulars
    
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR command_line, int)
    {
        try
        {
            Application->Initialize();
            Application->CreateForm(__classid(TForm1), &Form1);
            Application->CreateForm(__classid(TForm2), &Form2);
    
            Form1->parameters = command_line; //parameters ist eine public Variable von Form1
            Application->Run();
           }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
        return 0;
    }
    


  • Bocky< schrieb:
    Ich hab in der WinMain() den parameter command_line auf eine Variable gelegt. Diese Variable möchte ich jetzt in meinem eigentlichen Programm verwenden.

    Könntest auch ParamStr () und ParamCount verwenden. Gehört dann aber ins BCB-Forum, 3 Etagen höher :
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-78389.html



  • Martin Richter schrieb:

    Diese Variablen gehören zur CRT der MS Versionen des C 5.0 Compilers, also ca. seit 1987.

    Ja, ich hab sie gefunden (aber auch nur, indem ich sie eingegeben und per "go to definition" den Compiler darauf angesetzt habe). Dokumentiert sind die nirgends, oder?

    (und nebenbei wissen wir nicht einmal, welches System Bocky verwendet - Application->... klingt nicht sehr MS'ig)


  • Mod

    Ja! Das ist korrekt.
    Ich habe auch nur Bezug auf __argc/__argv genommen weil Du es nicht kanntest. Insofern war es mein Fehler auf die MS-spezifische Implementation hinzuweisen.

    Diese Variablen waren mal dokumentiert, in der aktuellen MSDN finde ich sie aufgrund der neuen besch<zensiert>...</zensiert> Suchfunktionen nicht mehr. Sind vermutlich auch nicht mehrin der CRT Beschreibung drin.

    Du Sie in einigen Samples direkt wenn Du mal die alte VC6 MSDN nach __argc durchsuchst.

    KB Artikel konnte ich diesbzgl. im Netz noch finden:
    http://support.microsoft.com/kb/126571
    http://support.microsoft.com/kb/200440

    Also gänzlich undokumentiert ist es nicht. Und verwendet wird das Ding doch relativ oft... 🕶



  • __argc/__argv gibt es meines Wissens bei jedem ernstzunehmenen Windows-Compiler



  • http://www.catch22.net/tuts/tips2.asp ... relativ weit unten steht des 😉



  • Also ich benutze den Borland-Builder 1 Standard.
    aber leider funzt das mit dem includen des headers nicht, da ich die Variable schon in

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    

    benutze.
    Das heist, eig müsste ich das so machen:

    #include "Main.h"   <--- Header deines Hauptformulars
    
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR command_line, int)
    {
        try
        {
            Application->Initialize();
            Form1->parameters = command_line; //vor dem erstellen des Fensters Variable zuweisenexistiert
    
            Application->CreateForm(__classid(TForm1), &Form1);
            Application->CreateForm(__classid(TForm2), &Form2);
            Application->Run();
           }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
        return 0;
    }
    

    Also die Variable vor dem Aufruf des Fensters zuweisen. Dies geht aber nicht, da das Fenster ja noch nicht existiert (EAccesViolation).

    Die Variable Parameters ist in der main.h-datei deklariert.



  • Kenne mich mit dem Borland-Quatsch nicht aus:

    Application->Initialize();
    Application->CreateForm(__classid(TForm1), &Form1);
    Form1->parameters = command_line;
    Application->CreateForm(__classid(TForm2), &Form2);
    Application->Run();
    

    ...



  • Bocky< schrieb:
    Also ich benutze den Borland-Builder 1 Standard.
    aber leider funzt das mit dem includen des headers nicht, da ich die Variable schon in

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    

    benutze.

    Richtig, du darfst die Variable (wenn du es auf diese Weise tust) nicht im Konstruktor benutzen...bzw. die is ja dann noch leer.
    Benutz Sie doch dann einfach in FormShow (also im Event). Alternativ könntest du versuchen den Standardkonstruktor umzuschreiben, sodass "command_line" gleich beim Erstellen mit übergeben wird. Aba da hab ich jetzt kein Plan ob das und wie es funktioniert....is noch zu früh 😉

    mfg



  • Habs anders gelöst.
    Hab im TForm1 einfach mir die Parameter nochmal geholt:

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {                         
     for (int i=1;i<=ParamCount();i++){
      parameters = ParamStr(i);
     }
    }
    

    So gehts gut


Anmelden zum Antworten