gpt4 book ai didi

c++ - wget for windows 在调用 createprocess() 时忽略选项

转载 作者:行者123 更新时间:2023-11-28 04:21:41 27 4
gpt4 key购买 nike

我正在尝试使用 wget for windows从 c++ 程序从网站下载 6 个文件并将结果连接为一个文件。这不是批处理文件的问题。命令只是:

wget -O bits.bin --wait=20 --random-wait --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0""http://url/to/the/file1""http://url/to/the/file2""http://url/to/the/file3""http://url/to/the/file4""http://url/to/the/file5""http://url/to/the/file6"

当从 .bat 文件执行时,这已经过测试并按预期工作。使用 --output-file= 而不是 -O 也适用于批处理文件。

但是当我尝试用 CreateProcessA() 调用 wget 时这些第一个选项被解释为 URL。 wget 尝试下载 bits.bin 作为 ftp 地址。它最终会忽略这些无意义的 URL,只下载并存储 6 个单独的文件,如 [URL1]、[URL2].1、[URL3].2 等,这些文件的 url 名称长得丑陋。

我认为 CreateProcess 将参数呈现给被调用程序的方式可能与 wget for windows 期望它们的方式不兼容,但我真的不明白为什么会有任何差异。

请注意,由于 6 个 URL 很长,参数字符串将近 900 个字符。所以我认为这在某种程度上限制了我的选择。我无法显示实际的 URL,因为它们包含密码和其他个人数据。

我曾尝试在参数字符串的不同部分添加引号,但没有成功。如果有的话,它似乎让事情变得更糟。我使用 sprintf 是因为在实际代码中我必须在运行时向每个 URL 中插入 key 和其他选项。

目前,除非这里有人有解决方案,否则我将放弃使用 CreateProcess() 来运行 wget。接下来我将尝试 ShellExecute(),然后在必要时尝试 System()。想知道 MAXPATH 是否会成为一个问题。我可能不得不调用 wget 6 次而不是一次,并自己管理随机延迟。我刚试过:

ShellExecuteA(NULL, NULL,"wget.exe", params, NULL, SW_SHOW);

它弹出一个确认对话框,当我允许它运行时,wget 似乎实际上并没有做任何事情。也许 System() 将是我唯一的选择。

注意:CreateProcess() 正在运行,因为我也在第二个参数中包含了 wget.exe。谢谢你们。 奇怪的是 ShellExecute 似乎根本不起作用,但我想这无关紧要。也许是一些实现细节,例如 MAX_PATH 限制。

我知道我可以将 CreateProcess 中的第一个参数设置为 NULL 并将程序名称包含在第二个 CreateProcess() 参数中,但随后我也引入了潜在的 MAX_PATH 问题。尽管我认为这并不比 ShellExecute() 差。我希望利用 CreateProcess 参数慷慨的 32768 个字符限制。

char params[1024];
sprintf(params,"--output-file=bits.new --wait=20 --random-wait --user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0\" \"url/to/file1\" \"url/to/file2\" \"url/to/file3\"");
STARTUPINFOA startstruct = {0};
startstruct.cb = sizeof(startstruct);
PROCESS_INFORMATION procinfo;
CreateProcessA("wget.exe",params,0,0,0,CREATE_NEW_CONSOLE,0,0,&startstruct, &procinfo);

最佳答案

我通过发送可执行文件名称作为第一个参数来使用 CreateProcess(),在第二个参数中发送进程名称加上其他参数,如

sprintf(params,"wget.exe --output-file=bits.new --wait=60 --random-wait --user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0\" \"url/to/file1\" \"url/to/file2\" \"url/to/file3\"");

关于c++ - wget for windows 在调用 createprocess() 时忽略选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55310522/

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