Programmparameter abfragen



  • Hallo,

    gibt es eine Methode mit der ich den oder die übergebenen Programmparameter abfragen kann?

    GetCommandLine gibt mir den Aufrufpfad zurück

    Jedoch wenn ich über eine Verknüpfung den Parameter über gebe sieht es folgendermaßen aus
    "Pfad\usw\Programm" -Parameter

    in der Konsole das was ich eingegeben habe
    prog -Parameter

    erscheint mir äußerst umständlich das zu parsen

    Gruß Raffzen



  • Ich wüsste keine andere Möglichkeit
    aber da mich das auch mal interresiert hat hab ich mal was geschrieben.
    Obs schön ist ist die andere Frage aber hier:

    void CCmdLineView::OnButton1() 
    {
    	CString szArg = (CString)GetCommandLine();
    	CStringList ArgList;
    	int argCnt = GetParamater(szArg, &ArgList);
    }
    
    WORD CCmdLineView::GetParamater(CString szArg, CStringList* ArgList)
    {
    	int iPos = szArg.Find(".exe",0);
    	int iPos2;
    	WORD cnt = 0;
    	CString szTemp;
    
    	szArg = szArg.Mid(iPos+5); // Parameter abgeschnitten
    	while (szArg.Find("-") != -1)
    	{
    		cnt++;
    		iPos = szArg.Find("-");
    		szArg = szArg.Mid(iPos+1);
    		iPos2 = szArg.Find("-");
    		if (iPos2!=-1)
    		{
    			szTemp = szArg.Mid(iPos-1,iPos2-1);
    			szArg = szArg.Mid(iPos2);
    			szTemp.TrimRight();
    			ArgList->AddTail(szTemp);
    		}
    		else
    		{
    			szTemp = szArg.Mid(iPos-1);
    			szTemp.TrimRight();
    			ArgList->AddTail(szTemp);
    			break;
    		}
    	}
    	return cnt;
    }
    


  • Ich hatte mir das in eine Map eingespeichert.

    #pragma warning(disable: 4786) 
    #include <map>
    #inclde <string>
    using std::map;
    using std::string;
    typedef map<string, string> Parameter;
    
    int main(int argc, char* argv[]) {
      // Der Programmname interessiert uns nicht.
      --argc;
      ++argv;
    
      Parameter params;
      for(int i = 0; i < argc; i+=2) {
        params[argv[i]] = argv[i+1];
      }
    
      // oder so
      /*
      for(int i = 0; i < argc; ++i) {
        params[argv[i]] = argv[++i];
      }
      */
      return 0;
    }
    

    Somit sind alle Parameter in einer Map.
    Bei "./testprogramm -silent yes -path /home/egon" kann man die Map nun auf "-silent" und auf "-path" abfragen.



  • @hehejo

    aber in einer MFC Anwendung kann ich doch nicht mit int main(...) kommen oder?



  • @Taelan

    in der Funktion

    WORD CCmdLineView::GetParamater(CString szArg, CStringList* ArgList)
    {
        int iPos = szArg.Find(".exe",0);
        int iPos2;
    .......
    

    ich kann das Prog in der Konsole ohne .exe aufrufen dann geht das auch nicht mehr



  • Hm, ja..
    Aber du könntest dir die Commandozeile in einen std::string schreiben.
    Hat der nicht eine Methode um ihn aufzusplitten?



  • hm
    wenn du kein MFC benutzt ist mein Lösungsansatz sowieso unbrauchbar

    bei C++ sind die Parameter in argc und argv versteckt allerdings hab ich das noch nie gebraucht und daher spontan keine ahnung wie die da drin stehen.



  • Naja eigentlich wollte ich wissen ob mir irgendeine Funktion dabei hilft das zu zerlegen. Dem is aber net so.

    Dann werde ich den AufrufString in 2 Fälle parsen

    1. Aufruf mit "" dann such ich die Params nach den ""
    2. Aufruf ohne dann suche ich nach dem ersten Leerzeichen

    Sollte so in jedem Fall funktionieren
    Gruß Raffzen



  • ich hätte mal ne frage stehen in einer MFC anwendung trotzdem argc und argv zu verfügung ?
    so das man diese in InitInstance() abfragen kann?



  • in der MFC gibt es afaik eine eigene Methode dafür (ProcessCommandLine oder so ähnlich), die du aus InitInstance aufrufen kannst.


Anmelden zum Antworten