gpt4 book ai didi

c++ - ShellExecuteEx 不传递长命令

转载 作者:太空宇宙 更新时间:2023-11-04 16:02:00 25 4
gpt4 key购买 nike

当我将 ShellExecuteEx 与这样的命令一起使用时 "-unused parameter -action capturescreenshot -filename C:\\ATDK\\Screenshots\\abcd.jbg" 一切正常,Executor.exe 以char* argv[] 具有所有约。 9个参数。但是当命令有更多的几个符号时,例如文件名为“abc...xyz.jpg”,那么该进程的 argc == 1 并且命令为空。所以命令在发送到 ShellExecute 之前是可以的 在我将其更改为 ShellExecute 而不是 Ex 之后,它起作用了!命令可以很长,但是已经成功通过了。任何人都可以解释有什么区别吗?这是我填写的 SHELLEXECUTEINFO 的代码。

std::wstringstream wss;
wss << L"-unused" << " " // added because we need to pass some info as 0 parameter
<< L"parameter" << " " // added because EU parser sucks
<< L"-action" << " "
<< L"capturescreenshot" << " "
<< L"-filename" << " "
<< L"C:\\ATDK\\Screenshots\\abc.jpg";

SHELLEXECUTEINFO shell_info;
ZeroMemory(&shell_info, sizeof(shell_info));

shell_info.cbSize = sizeof(SHELLEXECUTEINFO);
shell_info.fMask = SEE_MASK_ASYNCOK | SEE_MASK_NO_CONSOLE;
shell_info.hwnd = NULL;
shell_info.lpVerb = NULL;
shell_info.lpFile = L"C:/ATDK/Executor";
shell_info.lpParameters = (LPCWSTR)wss.str().c_str();
shell_info.lpDirectory = NULL;
shell_info.nShow = SW_MINIMIZE;
shell_info.hInstApp = NULL;
// 1
ShellExecuteEx(&shell_info);
// this sucks,
// GetLastError returns err code 2147483658,
//FormatMessage returns The data necessary to complete this operation is not yet available

// 2
ShellExecute(NULL, NULL, L"C:/ATDK/Executor", (LPCWSTR)wss.str().c_str(), NULL, NULL);
// OK!

最佳答案

你的错误在这里:

shell_info.lpParameters = (LPCWSTR)wss.str().c_str();

wss.str() 返回一个临时对象,该对象在创建它的完整表达式结束后不再存在。在那之后使用它是未定义的行为

要解决这个问题,您必须构造一个 std::wstring 对象,该对象的生命周期足以让对 ShellExecuteEx 的调用返回。

std::wstringstream wss;
wss << L"-unused" << " "
<< L"parameter" << " "
// ...

SHELLEXECUTEINFO shell_info;
ZeroMemory(&shell_info, sizeof(shell_info));

// Construct string object from string stream
std::wstring params{ wss.str() };

shell_info.cbSize = sizeof(SHELLEXECUTEINFO);
shell_info.fMask = SEE_MASK_ASYNCOK | SEE_MASK_NO_CONSOLE;
shell_info.hwnd = NULL;
shell_info.lpVerb = NULL;
shell_info.lpFile = L"C:\\ATDK\\Executor"; // Path separator on Windows is \
shell_info.lpParameters = params.c_str(); // Use string object that survives the call
shell_info.lpDirectory = NULL;
shell_info.nShow = SW_MINIMIZE;
shell_info.hInstApp = NULL;

ShellExecuteEx(&shell_info);

注意你的第二个电话

ShellExecute(NULL, NULL, L"C:\\ATDK\\Executor", wss.str().c_str(), NULL, NULL);

工作可靠。即使 wss.str() 仍然返回一个临时值,它在完整表达式结束之前一直有效(即在整个函数调用期间)。

关于c++ - ShellExecuteEx 不传递长命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42155265/

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