Verwenden Sie CreateProcess, um eine Batchdatei auszuführen

8

Ich versuche, CreateProcess zu verwenden, um einen neuen Umgebungsblock zu starten und eine Stapelverarbeitungsdatei in dem neuen Umgebungsblock auszuführen. Ich habe das msdn-Beispiel für CreateProcess gelesen und kam mit dem unten gezeigten Code.

Was passiert, wird die neue Eingabeaufforderung geöffnet und dort gestoppt. Meine .bat-Datei wird aus irgendeinem Grund nicht ausgeführt. Die Verwendung von System ("CALL path") ruft die .bat-Datei auf.

%Vor%     
user2970916 18.09.2014, 18:03
quelle

1 Antwort

15

Einige Probleme:

  1. Sie müssen die Option /C an cmd.exe übergeben, damit die .bat-Datei ausgeführt wird.
  2. Der zweite Parameter für CreateProcess muss eine änderbare Zeichenfolge sein. Kein Literal.
  3. Sie müssen Backslash-Zeichen in Literalen vermeiden.
  4. lpszCurrentVariable zeigt auf den von GetEnvironmentStrings zurückgegebenen Puffer. Sie können diesen Puffer nicht ändern. Sie müssen einen neuen Puffer ausreichender Länge zuweisen und die Umgebung darin kopieren. Fügen Sie dann Ihre Änderungen hinzu.
  5. Umgebungsblöcke sind doppelt null-terminiert. Standard-String-Funktionen sind bei doppelt null-terminierten Strings nicht sinnvoll.
  6. Die Verwendung von Funktionen wie StringCchCopy anstelle von C-Laufzeitfunktionen ist nur verwirrend. Nehmen Sie den MSDN-Beispielcode nicht als Musterbeispiel.
  7. C-Strings sind eine Bindung, mit der man arbeiten kann. Aber Sie verwenden C ++, also verwenden Sie std::wstring und andere Standardbibliotheksklassen und -funktionen.
  8. Sie müssen WINDOWS_LEAN_AND_MEAN definieren, bevor Sie Windows.h importieren.
  9. Für C ++ ist int main(void) falsch. Das Argument no% main ist int main() .

Der folgende Code zeigt Ihnen, wie Sie dies tun:

%Vor%     
David Heffernan 18.09.2014, 18:18
quelle