tonyfeng 发表于 2024-1-31 09:17

C++如何调用另一个cmd exe不让他继承自身环境变量

问下大家 ,我C++想调用外部EXE CMD 怎么设置让外部模式不继承我的环境变量
第一个exe设置了环境变量
SetEnvironmentVariable("PATH", L"D:\\Program Files\\TEST\\");


ShellExecute
调用第二个exe不想用第一个里面所有变量,但是我在第二个里面打印这个变量,还是一样的
CreateProcess
这个也是一样的
用VBS也是一样的,

我只想在第一个EXE中,启动第二个EXE,方式就像手动打开第二个一样,2个EXE毫无关系的去启动另一个EXE
用什么代码

苏紫方璇 发表于 2024-1-31 09:33

CreateProcess的lpEnvironment参数可以设置环境变量吧

tonyfeng 发表于 2024-1-31 10:58

苏紫方璇 发表于 2024-1-31 09:33
CreateProcess的lpEnvironment参数可以设置环境变量吧

设置了NULL也没有用
STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi, sizeof(pi));

        if (CreateProcess(NULL, L"d:\\b.exe", NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi) == TRUE) {
                std::cout << "b.exe started with PID: " << pi.dwProcessId << std::endl;
                // 等待子进程完成(可选)
                WaitForSingleObject(pi.hProcess, INFINITE);
                // 清理资源...
                CloseHandle(pi.hProcess);
                CloseHandle(pi.hThread);
        }
        else {
                std::cerr << "Failed to start b.exe" << std::endl;
                return 1;
        }

qqLinux 发表于 2024-1-31 11:02

有个系统api,这个api可以改变环境变量,先备份,然后清空,运行之后重新备份就可以了。(SetEnvironmentVariable, setenv)

苏紫方璇 发表于 2024-1-31 12:17

tonyfeng 发表于 2024-1-31 10:58
设置了NULL也没有用
STARTUPINFO si;
        PROCESS_INFORMATION pi;


msdn是这样写的
A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process.设置NULL会继承调用方的环境块
https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa

无闻无问 发表于 2024-1-31 13:09

main的第三个参数设置试试

fuhohua 发表于 2024-1-31 13:51

你先在第一个程序中现复制原始的环境变量,然后再设置SetEnvironmentVariable("PATH", L"D:\\Program Files\\TEST\\");,你打开第二个程序的时候,把原来复制的环境变量传过去就好了

tonyfeng 发表于 2024-1-31 13:57

fuhohua 发表于 2024-1-31 13:51
你先在第一个程序中现复制原始的环境变量,然后再设置SetEnvironmentVariable("PATH", L"D:\\Program Files ...

我是不需要环境,就想让它自己模仿人工手动打开,

tonyfeng 发表于 2024-1-31 14:00

苏紫方璇 发表于 2024-1-31 12:17
msdn是这样写的
设置NULL会继承调用方的环境块
https://learn.microsoft.com/en-us/windows/win32/api/ ...

参数
lpEnvironment

指向新进程的环境块的指针。如果此参数为 NULL,则新进程将使用调用进程的环境。就是继承原先的环境变量

环境块由一个以 null 结尾的字符串的 null 终止块组成。

我没有新进程的环境变量指针,我只是想模仿手动打开,那怎么办呢,请教一下,有代码吗

fuhohua 发表于 2024-1-31 14:01

tonyfeng 发表于 2024-1-31 13:57
我是不需要环境,就想让它自己模仿人工手动打开,

那用dos命令可能可以,你执行system("explorer 程序路径");试试
页: [1] 2
查看完整版本: C++如何调用另一个cmd exe不让他继承自身环境变量