使用ShellExecuteEx永久设置路径变量

3
我为您翻译这段内容。它与IT技术有关,涉及代码编写。通过这段代码,可以正确执行并返回true,但它不会更改Path变量的值。当我在cmd中输入“setx Path“C:\Program Files\Java\jdk1.7.0_02\bin\"时,它可以工作并更改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");

这里会出现什么问题呢?

这里运行正常。您能描述一下您是如何诊断故障的吗? - David Heffernan
请准确描述。说明您采取的确切步骤来验证该内容。 - David Heffernan
我进入“开始”-->“控制面板”-->“高级系统设置”-->“环境变量”,然后查看“用户变量”部分和“系统变量”部分。但是我没有看到任何变化发生。 - Aspen
引用看起来很奇怪。应该是 ShRun.lpParameters = "Path \"C:\\Program Files\\Java\\jdk1.7.0_02\\bin\\\""; - David Heffernan
改变它像你说的那样,但它仍然无法工作吗? - Aspen
显示剩余3条评论
1个回答

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\"""
错误: 无效的语法。默认选项不允许超过“2”次。
键入“SETX /?”以获取用法。

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


我修复了引用,但结果仍然相同。 - Aspen
当我使用g++将代码编译成一个简单的int main()程序时,会弹出一个安全对话框。但是当我使用MS编译器或从Delphi应用程序中调用ShellExecute时,一切都很好。你在使用哪个编译器? - David Heffernan
你可能希望提及如果像那样更改PATH环境变量会导致“10秒内被破坏”的故障模式。当Windows目录不再在PATH上时,会出现很多极难诊断的问题。如果你确实这样做了,最好也检查一下自己的机器;伤害并不是立即显现的,需要注销才能使新设置生效。 - Hans Passant
@HansPassant 我重新启动了电脑,但没有起作用。 - Aspen
@DavidHeffernan 我的意思是我使用ShellExecute解决了我的问题。问题在于我的早期代码没有正确设置路径,现在它已经正确设置了路径。 - Aspen
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接