【发布时间】:2014-09-18 18:03:29
【问题描述】:
我正在尝试使用 CreateProcess 来启动一个新的环境块并在新的环境块中运行一个批处理文件。我已经阅读了 CreateProcess 的 msdn 示例,并提出了如下所示的代码。
发生了什么,它将打开新的命令提示符,然后停在那里。由于某种原因,它不会运行我的 .bat 文件。使用 system("CALL path") 将调用 .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;
}
【问题讨论】:
-
在哪一行触发断点?您不确定的行正在尝试将两个新的环境变量添加到即将启动的进程的环境块中,并且您已经表明这就是您要执行的操作,所以我不确定您的关于他们的问题可能是。
-
我实际上是在尝试在批处理文件中设置环境变量。但是,当我进入批处理文件(没有创建新进程)时,%PATH% 变量具有来自 Visual Studio 的所有树数据。因此,当我尝试将新路径附加到 %PATH% 变量时,它包含冗余和多余信息。另外,我发现崩溃是由于使用“\”而不是“\\”
-
您的编辑没有解决我提出的所有问题。
-
如果您只需要系统环境变量,您可以调用
CreateEnvironmentBlock和hToken作为NULL和bInherit作为FALSE。
标签: c++ winapi batch-file createprocess