gpt4 book ai didi

c - 将 argv[] 传递给 CreateProcess() 的方法

转载 作者:太空狗 更新时间:2023-10-29 17:21:00 25 4
gpt4 key购买 nike

我的 C Win32 应用程序应该允许传递完整的命令行以启动另一个程序,例如

myapp.exe /foo /bar "C:\Program Files\Some\App.exe" arg1 "arg 2"

myapp.exe 可能类似于

int main(int argc, char**argv)
{
int i;

for (i=1; i<argc; ++i) {
if (!strcmp(argv[i], "/foo") {
// handle /foo
} else if (!strcmp(argv[i], "/bar") {
// handle /bar
} else {
// not an option => start of a child command line
break;
}
}

// run the command
STARTUPINFO si;
PROCESS_INFORMATION pi;
// customize the above...

// I want this, but there is no such API! :(
CreateProcessFromArgv(argv+i, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

// use startup info si for some operations on a process
// ...
}

我可以考虑一些解决方法:

两者都很冗长,重新实现了繁琐的windows命令行解析逻辑,这已经是CommandLineToArgvW()的一部分了。 .

是否有针对我的问题的“标准”解决方案?变通办法的标准(Win32、CRT 等)实现算作解决方案。

最佳答案

实际上比您想象的要容易。

1) 有一个 API,GetCommandLine() 会返回整个字符串

myapp.exe /foo /bar "C:\Program Files\Some\App.exe" arg1 "arg 2"

2) CreateProcess() 允许指定命令行,因此将其用作

CreateProcess(NULL, "c:\\hello.exe arg1 arg2 etc", ....) 

将完全满足您的需求。

3) 通过解析命令行,您可以找到 exe 名称的起始位置,并将该地址传递给 CreateProcess() 。可以用

轻松完成
char* cmd_pos = strstr(GetCommandLine(), argv[3]);

最后:CreateProcess(NULL, strstr(GetCommandLine(), argv[i]), ...);

编辑:现在我看到您已经考虑过这个选项。如果您担心性能损失,那么与流程创建相比,它们无足轻重。

关于c - 将 argv[] 传递给 CreateProcess() 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982602/

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