Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » GetCommandLine() - Seltsames Verhalten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
05.04.2014, 22:32 Uhr
Hans
Library Walker
(Operator)


Folgendes Programm:

C++:
/* Datei: cmdline.c

   Windows-Programm!
   Ermittelt die Kommandozeile unter Windows
*/

#include <windows.h>
#include <stdio.h>
#include <string.h>

main(int argc, char *argv[])
{
  char CommandLine[260],
       *clptr;
  
  clptr = GetCommandLine();
  strcpy (CommandLine, GetCommandLine());
  printf ("CMDline: %s\n", CommandLine);
  printf ("argv[0]: %s\n", argv[0]);
  return 0;
} /* von main */



Man sollte erwarten, dass das Programm 2 mal das Gleiche liefert, nämlich seinen Namen inclusive des Verzeichnispfades und der Dateinamenserweiterung. In meinem Fall:

Code:

C:\Daten\Watcom>cmdline
CMDline: C:\Daten\Watcom\cmdline.exe
argv[0]: C:\Daten\Watcom\cmdline.exe  


Nun, im Debugger tut es das auch, aber wenn ich es aus einer normalen Konsole (Eingabeaufforderung) heraus starte, dann liefert es diese Ausgabe:

Code:

C:\Daten\Watcom>cmdline
CMDline: cmdline
argv[0]: C:\Daten\Watcom\cmdline.exe  


Die Frage ist, warum? - Ich hab gerade keinen Schimmer, woran das liegen könnte.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.04.2014, 16:42 Uhr
TOSHMAX



Im zweiten Beispiele lautet der Kommandozeilenaufruf ja auch "cmdline". Evtl. startet der Debugger das Programm mit dem vollen Pfad, weshalb dieser auch angezeigt wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.04.2014, 23:42 Uhr
Hans
Library Walker
(Operator)


Wäre 'ne Möglichkeit, halte ich aber für unwahrscheinlich, weil ich den Debugger im selben Pfad auch aus der Kommandozeile heraus aufgerufen habe. Der Aufruf lautet:
wdw cmdline.exe

Meine Vermutung geht eher in die Richtung, das die Standard I/O-funktionen sich irgendwo an dem Ausgabeformat von GetCommandLine() aufhängen, weil der Pfad laut Doku in Anführungszeichen eingeschlossen ist, vorhandene Parameter aber nicht. Aber das kann ich nicht überprüfen.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.04.2014, 09:33 Uhr
Tommix



'Morgen

Zitat von Hans:
Meine Vermutung geht eher in die Richtung, das die Standard I/O-funktionen sich irgendwo an dem Ausgabeformat von GetCommandLine() aufhängen, ... , weil der Pfad laut Doku in Anführungszeichen eingeschlossen ist... Aber das kann ich nicht überprüfen.

(:HAE:) - Smiley funzt nicht.
Weder ist an Anführungszeichen irgend etwas Besonderes, noch ist eine Überprüfung dessen ein Problem:

C++:
printf("Say \"Hello\"!\n");


Ich denke schon das TOSHMAX recht hat.

Gruss,
Tommix

Dieser Post wurde am 09.04.2014 um 09:35 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.04.2014, 07:17 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von Tommix:
'Morgen
Weder ist an Anführungszeichen irgend etwas Besonderes, noch ist eine Überprüfung dessen ein Problem:


stimmt.... - dann liegt vielleicht doch ein Bug im Compiler vor...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.04.2014, 09:35 Uhr
Tommix



Hallo,

Zitat von Hans:
dann liegt vielleicht doch ein Bug im Compiler vor...

aber nein. Der Debugger ersetzt den Parameter durch den kompletten Pfad. Unter Linux ist so was wichtig, weil das aktuelle Verzeichnis nicht standardmäßig nach Programmen durchsucht wird. Da schreibt man auch mal "./a.out" zum aufrufen.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.04.2014, 10:20 Uhr
Hans
Library Walker
(Operator)


Hi,
nagut, aber das Programm läuft doch unter Windows; - es benutzt ja auch einen Aufruf aus dem WinAPI. Im übrigen finde ich es auch seltsam, dass in der ersten Ausgabezeile auch die Nameserweiterung, also ".exe" mit weg geschnitten wird, obwohl die im Debugger ebenfalls zu sehen ist.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.04.2014, 12:27 Uhr
Tommix



Der Debugger - nicht Dein Programm - macht es so, daß es sowohl unter Windows wie auch unter Linux funzt. Und im ersten Fall siehst Du eben was Du und nicht der Debugger eingetipp hast. Hättest Du cmdline.exe oder den kompletten Pfad eingegeben stünde das auch da.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.04.2014, 21:16 Uhr
Hans
Library Walker
(Operator)


Hm... - Ja okay, das mit dem kompletten Pfad hab ich inzwischen auch so festgestellt, aber dass der Debugger es so macht, dass es auch unter Linux funzt, glaub ich nicht, denn unter Visual C++ zeigen sich die gleichen Phänomene. Siehe Screenshots:

Ansicht in der Kommandozeile und
Ansicht im Debugger.

Und zum Vrgleich noch mal zwei Screenshots, wo das Programm mit Open Watcom gebaut wurde:

Ansicht in der Kommandozeile und
Ansicht im Debugger.

Wäre jetzt noch die Variante mit WinMain anstelle von main zu testen...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 13.04.2014 um 21:28 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.04.2014, 10:15 Uhr
Tommix



Hallo,
im Visual Studio kann man den auszuführenden Debugbefehl in den Projeteigenschaften unter "Debug" explizit angeben. Per default steht da $(TargetPath), ein Makro welches wie von Dir beobachtet aufgelöst wird. Nur der Programmname würde auch hier nicht funktionieren, da das Arbeitsverzeichnis (auch konfigurierbar) standardmäßig ein anderes ist.
Mir scheint aber, daß Du um das Ganze ein bisschen viel des Aufhebens machst.

Gruß,
Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: