Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Erster Parameter geht verloren (https://www.delphipraxis.net/162588-erster-parameter-geht-verloren.html)

blablab 30. Aug 2011 14:57

Erster Parameter geht verloren
 
Hallo!

Ich benutze folgenden Code:

Delphi-Quellcode:
      Result := CreateProcess(PChar(Programm), 'Halli hallo wie gehts denn so?'{PChar(CommandLine)}, nil, nil, true,
            CREATE_DEFAULT_ERROR_MODE, nil, PChar(ExtractFilePath(Programm)), StartupInfo, ProcessInfo);
Und ich rufe damit ein Programm aus, das einfach nur die Parameter anzeigt:

Delphi-Quellcode:
   for i := 0 to ParamCount do begin
      MemoParams.Lines.Add(ParamStr(i));
   end;
Und dabei geht immer der erste Parameter verloren. Das Programm zeigt also an:

-NameDerExe-
hallo
wie
gehts
denn
so?

Theoretisch kann ich als ersten Parameter ja einfach irgendeinen "Opfer-Wert" nehmen, der dann wegfällt. Aber ich hatte das Problem schon öfters und ich frage mich was dahinter steckt... Mache ich hier etwas falsch, oder gibts da einen Trick den ich nicht kenne?

Grüße
blablab

himitsu 30. Aug 2011 15:09

AW: Erster Parameter geht verloren
 
Eigentlich steckt in MSDN-Library durchsuchenGetCommandLine folgendes drin
Delphi-Quellcode:
EXEPath Param1 Param2 ...
,
wobei in EXEPath der eigentlich aufgerufene Pfad der ausgeführten EXE drinsteht.
(ruft man z.B. nur "MeinProgramm" über CMD auf, dann steht auch nur das dort drin)

Delphi-Referenz durchsuchenParamStr(0) ignoriert deshalb diesen Wert und gibt stattdessen MSDN-Library durchsuchenGetModuleFileName(0) zurück.


Zitat:

Zitat von MSDN: CreateProcess
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine

Du mußt also noch einen wert mehr angeben ;)
Also entweder einen "Dummywert" oder besser nochmals den EXEPath (Delphi-Programme stört es zwar nicht, aber andere Programme vielleicht doch) .


Probier es einfach mal
Delphi-Quellcode:
ShowMessage(GetCommandLine);
.

Quasi in etwa so:
Delphi-Quellcode:
Params := 'Halli hallo wie gehts denn so?';
Result := CreateProcess(PChar(Programm), PChar('"' + Programm + '" ' + Params), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE, nil, PChar(ExtractFileDir(Programm)), StartupInfo, ProcessInfo);

sirius 30. Aug 2011 15:14

AW: Erster Parameter geht verloren
 
Normalerweise (So auch in der Remark-Section von msdn) gibt man für Applicationname "null" an und für Commandline eben das "Programm"+Space+Parameter, so wie in einer Batch.

Und das ist (wie vorposter geschrieben) wahrscheinlich nur wegen der C-kompatibilität und argc.

blablab 30. Aug 2011 17:02

AW: Erster Parameter geht verloren
 
Vielen Dank!!!
Wieder etwas dazugelernt... :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz