- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我将 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/
我想使用 shellexecuteEX 调用 dpinst.exe/u .\\foldername\\foldername\\inffile.inf\d。这个怎么做。抱歉,我对多个参数感到困惑。我尝试
我正在尝试使用 ShellExecuteEx 安装 Windows 服务(使用 CBuilder 6 构建) 这是我的安装函数。 int WinServiceInstall(WideString Se
当我将 ShellExecuteEx 与这样的命令一起使用时 "-unused parameter -action capturescreenshot -filename C:\\ATDK\\Scre
我有一个表单的路径 ::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Fonts 如果我在资源管理器地址栏中输入它,它会正确打开控制面板 - 字体。 如何使用 Sh
最小、完整和可验证的示例: Visual Studio 2017 专业版 15.9.3 Windows 10 "1803"(17134.441) x64 环境变量 OANOCACHE设置为 1。 显示
我有一个应用程序需要运行链中的其他几个应用程序。我通过 ShellExecuteEx 运行它们。每个应用程序的运行顺序非常重要,因为它们相互依赖。例如: Start(App1); If App1.Is
我的应用程序由ShellExecuteEx使用“runas”动词启动了新过程,以获取管理员特权。新过程在用户文件夹中创建了一些文件,但是内置用户无法读取文件。只有管理员可以访问这些文件。在XP和V
我正在尝试使用以下功能打开图像: HANDLE openFile(char *path){ // path = "C:\Users\Foo Bar\Code\Test\test.jpg" Co
我正在尝试启动一个应用程序,然后监视它直到它关闭。我在使用 ShellExecuteEX 和 GetExitCodeProcess 时遇到了几个问题。 下面的代码在调用 GetExitCodeProc
在异步模式下运行 ShellExecuteEx() 后,如何检索主线程的退出代码? 进程退出代码可以简单地检索如下: SHELLEXECUTEINFO execInfo; execInfo.cbSiz
我正在使用 ShellExecuteEx 来运行外部应用程序: SHELLEXECUTEINFO shExInfo = { 0 }; shExInfo.cbSize = sizeof(shEx
我是 WinApi 的新手,我想打开我的 D: 驱动器中的文本文件,但这段代码不起作用。当我运行该应用程序时,出现错误:“Windows 找不到文件‘lobalizarion\Sorting\sort
我有一个应用程序需要在链中运行其他几个应用程序。我通过 ShellExecuteEx 运行它们。每个应用程序的运行顺序非常重要,因为它们相互依赖。例如: Start(App1); If App1.Is
我想出了这段代码。它将正确执行并返回 true。但它不会改变 Path 变量的值。当我这样输入时 --> setx Path "C:\Program Files\Java\jdk1.7.0_02\bi
假设我希望程序“C:\MyProgram.exe”以两个变量的参数运行。出现的问题是MyProgram只接收2个参数,而我明明传了3个参数。 我的代码: SHELLEXECUTEINFO ShE
我需要生成一个需要调用 UAC 的进程。我读过这篇文章:How can I run a child process that requires elevation and wait? . 不幸的是,我
1) 我用 ShellExecuteEx 启动了一个进程 2) 使用 检索 PID GetProcessId(shellExInfo.hProcess) 示例代码: SHELLEXECUTEINFO
我的问题与 PropertySheetExtension 有关,但默认文件属性表似乎存在相同的行为。以下代码的问题: // Snippet from http://stackoverflow.com/
我正在使用 Qt 在 Visual C++ (2015) 中创建自配置软件工具,根据需要运行其他几个第 3 方安装程序。当软件发现它需要一个不可用的库或驱动程序时,它将使用 ShellExecuteE
我正在用 qt 开发一个应用程序,我需要使用 ShellExecuteEx 来启动一个应用程序。我正在运行一个批处理文件,我需要向它传递 2 个参数。第一个参数只是一个字母,但第二个参数是一个路径,可
我是一名优秀的程序员,十分优秀!