使用ShellExecuteEx永久设置路径变量

时间:2013-04-01 09:21:13

标签: c windows path shellexecuteex

我想出了这段代码。它将正确执行并返回true。但它不会改变Path变量的值。当我这样输入时 - > setx路径“C:\ Program Files \ Java \ jdk1.7.0_02 \ bin \” 在cmd中,它可以工作并更改Path值

这是代码

// Prepare shellExecutInfo
SHELLEXECUTEINFO ShRun = {0};
ShRun.cbSize = sizeof(SHELLEXECUTEINFO);
ShRun.fMask = SEE_MASK_NOCLOSEPROCESS;
ShRun.hwnd = NULL;
ShRun.lpVerb =NULL;
ShRun.lpFile = "C:\\Windows\\System32\\setx.exe";
ShRun.lpParameters = "Path \"\"\"C:\\Program Files\\Java\\jdk1.7.0_02\\bin\\\"\"\"";
ShRun.lpDirectory =NULL;
ShRun.nShow = SW_SHOWNORMAL;
ShRun.hInstApp = NULL;

// Execute the file with the parameters
if(ShellExecuteEx(&ShRun))
    printf("done");
else
    printf("no");

这里会出现什么问题?

1 个答案:

答案 0 :(得分:1)

您对参数的引用是错误的。你的报价太多了。你需要写

ShRun.lpParameters = "Path \"C:\\Program Files\\Java\\jdk1.7.0_02\\bin\\\"";

要查看您的版本是否会失败,我在控制台上进行了以下实验:

C:\Users\heff>setx path """C:\Program Files\Java\jdk1.7.0_02\bin\"""
ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
Type "SETX /?" for usage.

我还注意到您使用的是SEE_MASK_NOCLOSEPROCESS。通常,您可以这样做,以便您可以等待返回的进程句柄。你似乎没有这样做。更重要的是,当您使用SEE_MASK_NOCLOSEPROCESS时,您似乎没有关闭过程句柄。