gpt4 book ai didi

c++ - 使用 C++ 在 Windows 中更新 PATH 环境变量

转载 作者:可可西里 更新时间:2023-11-01 11:30:42 24 4
gpt4 key购买 nike

我正在尝试从我当前的进程中启动一个新进程。我正在使用 CreateProcess() 来启动它。问题是我需要在我的 PATH 中有某些目录才能成功执行此操作。这是我当前的实现,但它不起作用。我做错了什么?

// Environment variables
char *env = new char[2048];
char *ptr = env;

char temp[MAX_PATH] = "PATH=";
strcpy(ptr, strcat(temp, plugin_path));
ptr += strlen(ptr) + 1;

char temp2[MAX_PATH] = "PATH=";
strcpy(ptr, strcat(temp, lib_path));
ptr += strlen(ptr) + 1;
*ptr = '\0';

// Execute
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

// error checking required
if(!CreateProcess(
NULL, // application name
command_path, // app.exe
NULL,
NULL,
TRUE,
0,
env, // environment
NULL,
&si,
&pi)) {
std::cout << GetLastError();
return 1;
}

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
std::cout << "Process Started!";

如果还有其他需要,请告诉我。

编辑:下面有人提到我需要更具体一点。它在环境变量未被传递的意义上不起作用。它失败是因为库路径不在 PATH 中。不过,createProcess 确实会启动它。

EDIT2:这是更新后的代码。同样的问题。此外,CreateProcess 抛出错误 1087,该错误似乎在文档中不存在。

// Environment variables
char env[2048];
char *ptr = env;
char *path_path = getenv("PATH");

// copy original path
memcpy(ptr, path_path, strlen(path_path));
ptr += strlen(ptr) + 1;
memcpy(ptr, ";", 1);
ptr++;

// copy plugin path
memcpy(ptr, plugin_path, strlen(plugin_path));
ptr += strlen(plugin_path) + 1;
memcpy(ptr, ";", 1);
ptr++;

// copy libpath
memcpy(ptr, lib_path, strlen(lib_path));
ptr += strlen(lib_path) + 1;
memcpy(ptr, ";", 1);
ptr++;

// double null terminated
memcpy(ptr, "\0\0", 2);

std::cout << "ENV : " << env << std::endl;

// error checking required
if(!CreateProcess(
NULL, // application name
command_path, // app.exe
NULL,
NULL,
TRUE,
0,
env, // environment
NULL,
&si,
&pi)) {
std::cout << GetLastError();
return 1;
}

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
std::cout << "Process Started!";

最佳答案

PATH 变量是单个变量。该变量中列出了不同的目录,以分号分隔。但是您已尝试两次定义变量。那是错误的。

代码应该是这样的(假设你想扩展现有的路径):

char *env = new char[2048]; // fingers crossed this is enough
strcpy(env, "PATH=");
strcat(env, getenv("PATH"));
strcat(env, ";");
strcat(env, plugin_path);
strcat(env, ";");
strcat(env, lib_path);
env[strlen(env)+1] = '\0';

虽然这段代码(就像你在问题中的那样)只是在乞求缓冲区溢出。

如果您使用 C++ 工具来构建您的字符串,将会容易得多。例如:

std::stringstream ss;
ss << "PATH=" << getenv("PATH");
ss << ";" << plugin_path;
ss << ";" << lib_path;
ss << '\0';
std::string env = ss.str();

然后将env.c_str()传递给CreateProcess

这不仅使代码更易于阅读和验证,而且您知道您不会溢出任何缓冲区。

我还注意到您传递的环境中只定义了一个变量,即 PATH。如果您从调用进程的环境开始,将额外的目录添加到 PATH,然后将其作为新进程的环境传递,可能会更好。

关于c++ - 使用 C++ 在 Windows 中更新 PATH 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com