Programm-Parameter übergeben und in MessageBox ausgeben



  • Hallo Zusammen,
    wie übergebe ich Programm-Parameter und lasse gewünschten Parameter in einer Messagebox ausgeben. Wie es mit einem Konsolen-Programm (siehe Beispiele) geht weiss ich aber wie funzt das mit Api?

    //XXXX Beispiel mit Konsole:
    int main(int argc, char* argv[])
    {
      string parameter1 = argv[1];   // mitgegebener Parameter bei Programmstart
      MessageBox ( NULL, parameter1.c_str(), "Fenstertitel", MB_OK);
      return 0;
    }
    
    //XXXX Beispiel mit Api:
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
    {
      parameter1 = ??????
      MessageBox ( NULL, "parameter1", "Fenstertitel", MB_OK);
      return 0;
    }
    

    Ein Codeschipsel sagt of mehr als tausend Worte 😉 Ansonsten wünsche ich Allen schöne Ostern und geht bei diesem schönen Wetter raus anstatt immer nur vor der Kiste zu hocken!! Danke im voraus für eure Hilfe! Gruss rommi
    PS: habe Windows XP Prof und VisualC++ 2008 im Einsatz



  • der parameter szCmdLine ist ein zeiger auf char und enthält die kommandozeilenparameter. allerdings musst du sie selbst zerlegen



  • Hallo player4245 danke für die Antwort. Was meinst du mit zerlegen. Kannst du mir mal ein Beispiel posten?
    Gruss, rommi



  • in einer konsolenanwendung bekommst du ja alle parameter in einem zweidimensionalen array serviert. z.B.
    argv[0]="programm.exe"
    argv[1]="-v" ...

    aber hier bekommst du nur einen string mit allen parametern z.B.
    szCmdLine="-v -s"

    den musst du zerlegen um ihn auszuwerten:

    // bei zwei parametern
    char *e, *z;
    
    e=strtok(szCmdLine, " ");
    z=strtok(NULL, " ");
    // e="-v" z="-s"
    

    das ganze kannst du je nach wunsch noch in eine schleife packen, um alle parameter auszuwerten.
    P.S. stör dich nicht an dem PSTR, das ist nur ein typedef auf char*



  • Hallo player424, danke klappt prima!

    Gruss, rommi



  • player424 schrieb:

    // bei zwei parametern
    char *e, *z;
    
    e=strtok(szCmdLine, " ");
    z=strtok(NULL, " ");
    // e="-v" z="-s"
    

    Diese Lösung berücksichtigt nicht Parameter die ein Leerzeichen enthalten, wie z.B. "C:\Program Files\...", und ist daher nur bedingt zu empfehlen. Es gibt für Unicode die Funktion CommandLineToArgvW, leider gibt es die nicht für multibyte Anwendungen. Eine mögliche Funktion könnte so aussehen:

    PCHAR *CommandLineToArgvA(PCHAR CmdLine, int* _argc){
    
    	PCHAR			*argv;
    	PCHAR			_argv;
    	ULONG			 len;
    	ULONG			 argc;
    	CHAR			 a;
    	ULONG			 i, j;
    	BOOLEAN		in_QM;
    	BOOLEAN		in_TEXT;
    	BOOLEAN		in_SPACE;
    
    	len = strlen(CmdLine);
    	i = ((len+2)/2)*sizeof(PVOID) + sizeof(PVOID);
    	argv = (PCHAR*)GlobalAlloc(GMEM_FIXED, i + (len+2)*sizeof(CHAR));
    	_argv = (PCHAR)(((PUCHAR)argv)+i);
    	argc = 0;
    	argv[argc] = _argv;
    	in_QM = FALSE;
    	in_TEXT = FALSE;
    	in_SPACE = TRUE;
    	i = 0;
    	j = 0;
    	while(a = CmdLine[i]){
    		if(in_QM){
    			if(a == '\"'){
    				in_QM = FALSE;
    			}else{
    				_argv[j] = a;
    				j++;
    			}
    		}else{
    			switch(a){
    				case '\"':
    					in_QM = TRUE;
    					in_TEXT = TRUE;
    					if(in_SPACE){
    						argv[argc] = _argv+j;
    						argc++;
    					}
    					in_SPACE = FALSE;
    					break;
    				case ' ':
    				case '\t':
    				case '\n':
    				case '\r':
    					if(in_TEXT) {
    						_argv[j] = '\0';
    						j++;
    					}
    					in_TEXT = FALSE;
    					in_SPACE = TRUE;
    					break;
    				default:{
    					in_TEXT = TRUE;
    					if(in_SPACE){
    						argv[argc] = _argv+j;
    						argc++;
    					}
    					_argv[j] = a;
    					j++;
    					in_SPACE = FALSE;
    					break;
    				}
    			}
    		}
    		i++;
    	}
    	_argv[j] = '\0';
    	argv[argc] = NULL;
    	(*_argc) = argc;
    	return argv;
    }
    

    Btw, die ist nicht auf meinem Mist gewachsen, aber ich finde sie sehr hilfreich.



  • Wenn du mit MSVC arbeitest stehen dir auch immer die Globalen __argv und __argc zur Verfügung. Wurden erst vor ein paar Tagen im Forum genannt.



  • Hallo guggstu,
    danke für deinen Post! Vorerst langt mir die Lösung von player424. Wobei ich nicht ganz verstehe was du meinst? Ich übergebe die Programm-Parameter in Anführungszeichen (also z.B. > meinprog.exe "c:\ord ner1\ordner2""c:\ord ner1\ordner3") und gebe der Funktion strtok als Trennzeichen "\"" mit. Klappt auch bei mehreren Paramtern und Leerzeichen im Pfadnamen.

    Gruss, rommi



  • Hallo Zusammen, ich denke __argv und __argc is wohl das beste für meine Zwecke und Umgebung. Danke! Gruss rommi



  • aber man muss erwähnen das dies nicht portabel ist.

    @*guggstdu*: in einem konsolenprogramm werden die parameter auch anhand einem leerzeichen getrennt. ausserdem wird ein parameter in anführungszeichen meines wissens eh als ein parameter gewertet (s. DOS Kommando cd)



  • player424 schrieb:

    @*guggstdu*: in einem konsolenprogramm werden die parameter auch anhand einem leerzeichen getrennt. ausserdem wird ein parameter in anführungszeichen meines wissens eh als ein parameter gewertet (s. DOS Kommando cd)

    Ich mach dir eine Vorschlag, mach doch einfach ein kleines Fensterprogramm und setze wahlweise deine Kommandozeilenauswertung und dann die von mir gepostete ein, benutze Anführungszeichen und Argumente mit Leerzeichen. Dann wirst du feststellen, dass mein Code läuft, deiner aber nicht.

    @rommy
    klar klappt das, wenn du das so schreibst:
    meinprog.exe "c:\ord ner1\ordner2""c:\ord ner1\ordner3"
    arg0 = 'meinprog.exe '
    arg1 = 'c:\ord ner1\ordner2'
    arg2 = 'c:\ord ner1\ordner3'

    die korrekte schreibweise wäre jedoch:
    meinprog.exe "c:\ord ner1\ordner2" "c:\ord ner1\ordner3"
    und dann bekommst du,

    arg0 = 'meinprog.exe '
    arg1 = 'c:\ord ner1\ordner2'
    arg2 = ' '
    arg3 = 'c:\ord ner1\ordner3'

    wenn du nur \" als Delimiter einsetzt. Nur ist das keine gebräuchliche Schreibweise für eine Kommandozeile


Anmelden zum Antworten