我想使用CreateProcess启动新环境块并在新环境块中运行批处理文件。我已经阅读了CreateProcess的msdn示例,并提出了如下所示的代码。使用CreateProcess运行批处理文件
发生了什么,它会打开新的命令提示符,然后停在那里。由于某种原因,它不会运行我的.bat文件。使用系统(“CALL路径”)将调用.bat文件。
#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;
}
那一行它触发一个破发点?您不确定的行正在尝试将两个新的环境变量添加到即将启动的流程的环境块中,并且您已指出这是您正在尝试执行的操作,所以我不确定您的操作关于他们的问题可能是。 – 2014-09-18 18:11:57
我实际上是试图在批处理文件中设置环境变量。但是,当我到达批处理文件(不创建新进程)时,%PATH%变量具有来自visual studio的所有树数据。所以,当我尝试将新路径附加到%PATH%变量时,它将包含冗余和过多的信息。另外,我发现崩溃是由于使用“\”而不是“\\” – user2970916 2014-09-18 18:21:49
您的编辑没有解决我提出的所有问题。 – 2014-09-18 18:38:24