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.Verwenden Sie CreateProcess, um eine Batchdatei auszuführen
Was passiert, wird es die neue Eingabeaufforderung öffnen und dort aufhören. Meine .bat-Datei wird aus irgendeinem Grund nicht ausgeführt. Die Verwendung von System ("CALL-Pfad") ruft die .bat-Datei auf.
#include <iostream>
#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>
#include <strsafe.h>
#define BUFSIZE 4096
int main()
{
//system("CALL C:\\HFSS\\setup_vars.bat");
//return 0;
LPWCH chNewEnv;
LPTSTR lpszCurrentVariable;
DWORD dwFlags = 0;
TCHAR szAppName[] = TEXT("C:\\windows\\system32\\cmd.exe");
TCHAR cmdArgs[] = TEXT("C:\\HFSS\\setup_var.bat");
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL fSuccess;
// Copy environment strings into an environment block.
chNewEnv = GetEnvironmentStrings();
lpszCurrentVariable = (LPTSTR)chNewEnv;
if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MySetting=A"))))
{
printf("String copy failed\n");
return FALSE;
}
lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MyVersion=2"))))
{
printf("String copy failed\n");
return FALSE;
}
// Terminate the block with a NULL byte.
lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
*lpszCurrentVariable = (TCHAR)0;
// Create the child process, specifying a new environment block.
SecureZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
#ifdef UNICODE
dwFlags = CREATE_UNICODE_ENVIRONMENT;
#endif
fSuccess = CreateProcess(szAppName, cmdArgs, NULL, NULL, TRUE, dwFlags,
(LPVOID)chNewEnv, // new environment block
NULL, &si, &pi);
if (!fSuccess)
{
printf("CreateProcess failed (%d)\n", GetLastError());
return FALSE;
}
std::cout << "In new environment\n";
WaitForSingleObject(pi.hProcess, INFINITE);
return TRUE;
}
Auf welcher Linie hat es einen Haltepunkt auslösen? Die Zeilen, von denen Sie nicht sicher sind, versuchen, dem Umgebungsblock des Prozesses, der gestartet werden soll, zwei neue Umgebungsvariablen hinzuzufügen, und Sie haben angegeben, dass Sie das versuchen, also bin ich mir nicht sicher, was Sie tun sollen Frage nach ihnen könnte sein. –
Ich versuche tatsächlich, die Umgebungsvariablen in der Batchdatei festzulegen. Zu dem Zeitpunkt, zu dem ich die Stapelverarbeitungsdatei öffne (ohne den neuen Prozess zu erstellen), enthält die Variable% PATH% jedoch alle Baumdaten von Visual Studio. Wenn ich also versuche, den neuen Pfad an die Variable% PATH% anzufügen, werden überflüssige und überflüssige Informationen eingeschlossen. Außerdem fand ich den Absturz wegen der Verwendung von "\" anstelle von "\\" – user2970916
Ihr Edit adressiert nicht alle Punkte, die ich angesprochen habe. –