gpt4 book ai didi

windows - 如何在CreateProcess实例化的命令中使用或扩展环境变量?

转载 作者:可可西里 更新时间:2023-11-01 09:41:41 29 4
gpt4 key购买 nike

以下代码利用 CreateProcess 运行带有环境变量的命令。在这里,它尝试运行 notepad %APPDATA%\test.txt

如果我直接在 Windows 的 CMD 中运行 notepad %APPDATA%\test.txt,%APPDATA% 将被展开。但是,CreateProcess 执行时,环境变量不能扩展。你能帮忙评论一下原因和解决方法吗?任何意见将不胜感激!

directly within cmd use CreateProcess

    program TestConsole2;

{$APPTYPE CONSOLE}

uses
Windows, SysUtils;

var
I: Integer;
ProgramName: String;
StartInfo : TStartupInfo;
ProcInfo : TProcessInformation;
CreateOK : Boolean;
begin
try

FillChar(StartInfo, SizeOf(StartInfo), #0);
FillChar(ProcInfo, SizeOf(ProcInfo), #0);
StartInfo.cb := SizeOf(StartInfo);

ProgramName := 'NOTEPAD %APPDATA%\test.txt';
CreateOK := CreateProcess(
nil, PChar(ProgramName), nil, nil, True, 0, nil, nil, StartInfo, ProcInfo);
if CreateOK then WaitForSingleObject(ProcInfo.hProcess, INFINITE);

Readln(ProgramName);

except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

最佳答案

调用ExpandEnvironmentStrings扩展环境变量。

当您使用 cmd.exe 时,它​​会为您执行扩展。 CreateProcess 没有,因此您需要在调用 CreateProcess 之前执行此操作。或者,您可以使用 ShellExecute 来扩展环境字符串。

您当前的代码不符合 CreateProcess 的约定。第二个参数必须是指向可修改内存的指针。如果您使用的是 ANSI API,则可以避免这种情况,但是当以 Unicode 为目标时,您的代码很可能会失败。传递指向可修改内存的指针而不是指向文字的指针。如果您添加了一个扩展环境变量的调用,那么您最终会得到一个可修改的字符串。

最后,您似乎只是想打开一个文本文件。为什么要强制用户在记事本中查看呢?我的文本文件默认编辑器不是记事本。我讨厌任何强制我使用记事本的程序。而是让 shell 在用户首选的编辑器中打开文件。调用 ShellExecute,使用“打开”作为动词并将文本文件名作为文件名参数传递。另一方面,也许您知道所有这些,而这只是示例代码。如果是这样,请忽略此建议。

关于windows - 如何在CreateProcess实例化的命令中使用或扩展环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9890746/

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