[c] Proigramm-Parmeter übergabe bei Windows

Cusco

Erfahrenes Mitglied
Na da hat sich Microsoft ja was tolles ausgedacht mit der Programm-Parameter übergabe, einfach alles in einen String hauen und der Programmierer kann zusehen wie er den auseinander bekommt bzw an die einzelnen Parameter rann kommt. Warum wurde das mit arg und argv nicht beibehalten?

Stellt Windows nun wenigstens eine Funktion dafür bereit um den String aufzuschlüsseln?
Bei meinen Programm werden mehr als 3 Paramter übergeben (Quellpfad, Zieldatei, Formatvorlage, [[Dateimuster] ...]). Bei einer eigenen Funktion dazu macht mir vor allem bei dateipfad übergaben, evt Leer Zeichen kopfschmerzen wo der Pfad in Anfügrungszeigen übergeben werden muss. Ein einfacher Check Leerzeichen = neuer parameter fällt also flach.

Wie macht man das Nun?
 
Moin moin,

wo ist dein Problem? Wenn ich mich an die alten Dos-Zeiten erinnere, dann wurden parameter mit "/" begonnen. Ob da jetzt nen SPACE ist oder nicht ist doch egal... Die Dinger machen eh Stress wenn man Dateipfade angibt aber gleichzeitig vormatiert auslesen will.

Gruss Michael
 
CodeFatal hat gesagt.:
Moin moin,

wo ist dein Problem? Wenn ich mich an die alten Dos-Zeiten erinnere, dann wurden parameter mit "/" begonnen. Ob da jetzt nen SPACE ist oder nicht ist doch egal... Die Dinger machen eh Stress wenn man Dateipfade angibt aber gleichzeitig vormatiert auslesen will.

Gruss Michael

Es gibt eine funktion zum Aufschlüsseln, CommandLineToArgvW die ist aber für UNICODE, eine Funktion für ANSI habe ich nicht gefunden, gibt es eine? Mein Programm ist komplett in ANSI gehalten da die HTML-Dateien so viel ich weiss alle in ANSI vorliegen und ich habe keine Lust das zu ändern, da müste ich fast das ganze Programm umkrämmpeln.

Das mit / als anfang kannte ich noch gar nicht, naja die Doszeiten habe ich auch nicht erlebt, da war ich ab 92 mit dem C64 und später ab ca. 94 mit dem Amiga beschäftig. 99 erst holte ich mir den ersten PC 450Mhz PIII der war mit Win98 ausgestattet. Mann das ist ja auch schon 7 Jahre her das kommt mir gar nicht so lang vor. :rolleyes: Ca 2002 habe ich den defekten Amiga1200PPC fün nen Apel und Ei verkauft (Ich kannte die Ebay-Preise nicht, dachte PC-Preise wären auch ca. Amigapreise, da hatte ich mich gewaltig getäuscht :( ) und nur noch mit Amiga-Emulatoren (Amithlon und WinUAE) gearbeitet bis heute. Nun bin ich am Überlegen die Programmierei auf dem Amiga aufzugeben (bin einer der letzten verbliebenen) und zu Windows über zu gehen.

Beim Amiga gibt es übrigens für Parameter in C eigene Funktionen die das erleichtern. Irgendwie gibt man in Main die Parameternamen an z.B "Quelle Ziel [a f g j]" und dann kann über eine OS-Funktion der parameter z.B. von "Ziel" ausgelesen werden, ohne auf die Reihenfolge der Parameter achten zu müssen. wie genau das Geht weis ich auch nicht, da ich das OS nicht in C Programmiert habe ich habe nur mal in einenn Beipiel gesehen, als ich von Amiblitz2 auf C umsteigen wollte.
 
deepthroat hat gesagt.:
Hi.

Du kannst dir ja mal die CommandLineToArgvW Funktion anschauen: http://msdn.microsoft.com/library/d...ell/reference/functions/commandlinetoargv.asp

Gruß

Oh den Beitrag habe ich glatt übersehen :(

Edit: Wie im Vorherigen Beitrag raus geht habe ich die Funktion auch schon entdeckt, aber leider ist die für UNICODE ich müste daher CMPLine in UNICODE übersetzen, ich glaub eine Funktion dafür habe ich schon gesehen, CommandLineToArgvW ausführen und dann die einzelnen Strings wieder zurück in Ansi übersetzen. das dürfte aber einfacher gehen als selbt eine Aufteilung zu schreiben. Ich weiss jetzt aber leider nicht von Welchen Typ unicode ist, ich glaub short int oder so, das müste ich direkt angeben, für die Stings, werde mich mal gleich mal schlau machen.
 
Zuletzt bearbeitet:
Ah habe es hinbekommen :)

Es sind Maximal aber nur 50 Parameter möglich, was aber reichen dürfte

Code:
     TCHAR    szarg[50][MAX_PATH];
     LPWSTR   *szArglist;
     int nArgs,i;
     
     szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
     if( NULL == szArglist )
     {
       nArgs=0;
     }
     else
     {if(nArgs>50){nArgs = 50;);
      for( i=0; i<nArgs; i++){
          wcstombs(szarg[i],szArglist[i],MAX_PATH);}
       LocalFree(szArglist);
      }
     
     for( i=0; i<nArgs; i++){
           printf("%i = '%s'\n",i,szarg[i]);}
 
Zuletzt bearbeitet:
Zurück