我想使用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