【问题标题】:How to pass arguments with ShellExecuteEx?如何使用 ShellExecuteEx 传递参数?
【发布时间】:2017-06-27 10:38:56
【问题描述】:

我将 IPC 用于共享内存。

我需要用 IPC 打开另一个程序,但我想知道如何传递参数。

下面是我的 IPC 类的执行函数。

int execute(std::string exePath, std::string exeName, int console = 1)
{
    SHELLEXECUTEINFOA p_info;

    ZeroMemory(&p_info, sizeof(SHELLEXECUTEINFOA)); //초기화
    p_info.cbSize = sizeof(SHELLEXECUTEINFOA);
    p_info.lpFile = exeName.c_str(); // 파일 이름
    p_info.lpDirectory = exePath.c_str(); //파일 위치

    p_info.nShow = console; //콘솔 show
    p_info.fMask = SEE_MASK_NOCLOSEPROCESS;

    return ShellExecuteEx(&p_info);
};

【问题讨论】:

  • 您可以使用lpParameters 成员或SHELLEXECUTEINFO,但是如果您不需要提升 - 最好使用Createprocess 而不是ShellExecuteEx

标签: winapi ipc shared-memory


【解决方案1】:

使用SHELLEXECUTEINFOlpParameters 成员传递参数。

其他一些cmets:

  • 由于您显式使用 ANSI 版本的结构 SHELLEXECUTEINFOA,因此对函数调用执行相同操作并使用 ShellExecuteExA 是合适的。
  • 通过将结构初始化为声明的一部分来避免调用ZeroMemorySHELLEXECUTEINFOA p_info = { 0 };
  • 您使用SEE_MASK_NOCLOSEPROCESS 但未能关闭进程句柄。这是句柄泄漏。
  • 除非您使用ShellExecuteExrunas 动词来提升进程,否则调用CreateProcess 似乎更合适。既然可以直接打电话给CreateProcess,为什么还要叫ShellExecuteEx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多