4 Stimmen

CreateProcess - lpApplicationName vs lpCommandLine

Ich habe die CreateProcess Win-API verwendet, und ich habe mich gefragt, was der Unterschied zwischen der Verwendung der lpApplicationName und lpCommandLine für Argumente vs. nur der lpCommandLine-Parameter war.

Zum Beispiel:

CreateProcess(NULL, L"C:\Path\To\Notepad.exe", L"C:\Path\To\File\To\Load.txt"... etc
CreateProcess(NULL, NULL, L"C:\Path\To\Notepad.exe C:\Path\To\File\To\Load.txt"... etc

Ich nehme an, dass die zweite Option, bei der nur lpCommandLine verwendet wird, dem Öffnen von cmd.exe und dem Ausführen genau dieser Zeile entspricht. Aber was ist mit der ersten Zeile? Wird damit die Anwendung geladen und werden die Befehlszeilenargumente anders angegeben?

Ich habe einen Blick auf die MSDN-Dokumentation für die API, aber es scheint nicht wirklich Detail, was passiert, das, was die Parameter enthalten können, die in Ordnung ist, aber ich bin nur verwirrt über was ich tun sollte, wenn es mehrere Möglichkeiten, es zu tun sind.

Bitte beachten Sie, dass die beiden Beispielzeilen möglicherweise nicht funktionieren, da lpCommandLine eine LPTSTR und nicht eine LPCTSTR erfordert. Es dient nur dem besseren Verständnis.

Vielen Dank für jede Hilfe!

Andy

6voto

John Punkte 5461

Es wird empfohlen, beide Parameter zu verwenden. Wenn Sie lpApplicationName nicht angeben, überlassen Sie es Windows, lpCommandLine zu analysieren, um den Anwendungsnamen zu ermitteln. Da Leerzeichen in Datei- und Verzeichnisnamen ein gültiges Zeichen sind, kann dies (in seltenen Fällen) dazu führen, dass die falsche Anwendung ausgeführt wird. (z.B. wenn Sie c: \program.exe und Sie starten ein Programm unter c: \program Dateien in Windows XP).

In beiden Fällen sollten Sie den Anwendungsnamen in lpCommandLine verwenden, da dieser zur Berechnung von Argv[0] verwendet wird.

3voto

Anders Punkte 89514

Ich verwende nie lpApplicationName und zitiere immer den Anwendungsteil von lpCommandLine, in Ihrem Beispiel würde ich ausführen "C:\Path\To\Notepad.exe" "C:\Path\To\File\To\Load.txt" (Es ist eine gute Idee, alle an CreateProcess übergebenen Pfade zu zitieren.) Die Verwendung von lpApplicationName kann Probleme mit Kindprozessen verursachen, die auf argv[0] zugreifen, weshalb ich davon Abstand nehme.


<rant> Die Verwendung von CreateProcess für einen anderen Benutzer als Sie selbst kann problematisch sein, da NT6+ zu jedem Zeitpunkt entscheiden kann, dass die von Ihnen ausgeführte Aufgabe aufgrund von Anwendungskompatibilitäts-Shims und/oder Installer-Erkennung Administratorrechte erfordert, und CreateProcess dann einfach fehlschlägt. Sofern Sie nicht die Debug-Funktion verwenden oder die Job-Flags umgehen müssen, würde ich vorschlagen, einfach ShellExecute[Ex] aufzurufen, um auf der sicheren Seite zu sein... </rant>

1voto

karlphillip Punkte 89618

Laut MSDN , lpAnwendungsname ist optional und kann NULL sein. In diesem Fall muss der Modulname das erste durch Leerzeichen getrennte Token in der Zeichenfolge lpCommandLine sein.

Wenn das ausführbare Modul eine 16-Bit-Anwendung ist, sollte lpApplicationName NULL sein und die Zeichenkette, auf die lpCommandLine zeigt, sollte das ausführbare Modul sowie seine Argumente angeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X