【问题标题】:Clarification on calling CreateProcessAsUser with command line parameters using C++关于使用 C++ 使用命令行参数调用 CreateProcessAsUser 的说明
【发布时间】:2012-12-22 08:15:28
【问题描述】:

我对使用命令行参数调用CreateProcessAsUser 的正确方法有些困惑。因此,无需详细填写其余参数,有人可以确认这是应该如何完成的吗? (也就是说,我应该把exe文件路径作为第一个命令行参数,还是指定为lpApplicationName就够了?)

LPCTSTR pExePath = L"c:\\program files\\sub dir\\program.exe";
LPCTSTR pCmdLine = L"v=\"one two\"";

TCHAR buff[MAX_PATH];
StringCchCopy(buff, MAX_PATH, _T("\""));
StringCbCat(buff, MAX_PATH, pExePath);
StringCbCat(buff, MAX_PATH, _T("\" "));
StringCbCat(buff, MAX_PATH, pCmdLine);

CreateProcessAsUser(hToken, pExePath, buff, NULL, NULL, FALSE, dwFlags, NULL, NULL, &si, &pi);

【问题讨论】:

    标签: c++ winapi process


    【解决方案1】:

    如果CreateProcessAsUser 的第二个参数是NULL,那么模块名称必须是第三个参数中第一个空格分隔的标记。

    如果CreateProcessAsUser 的第二个参数不是NULL,那么它将作为可执行文件执行。在这种情况下,第三个参数可以是

    a)"EXENAME p1 p2"

    也可以

    b)"p1 p2"

    如果你选择了a),那么子进程将有以下内容

    argv[0] --> EXENAME

    argv[1] --> p1

    argv[2] --> p2

    如果你选择了b),那么子进程就会有

    argv[0] --> p1

    argv[1] --> p2

    无论哪种方式,要执行的进程都是EXENAMECreateProcessAsUser 的第二个参数)。然而,被调用的进程应该知道命令行参数的传入方式。

    如果您使用 b),您还可以选择将第二个参数作为 NULL 传递给 CreateProcessAsUser

    【讨论】:

    • 谢谢。但是大多数 Windows 进程难道不期望 A 场景吗?引号也不应该像"EXENAME" p1 p2吗?
    • 大多数C/C++ 程序员会使用a)。此外,仅当 PATHANDEXENAME 包含空格时,您才需要在 PATHANDEXENAME 周围加上引号。即 "c:\\mypath\\a.exe" 可以在没有额外引号的情况下正常工作,但 "\"c:\\my path\\a.exe\"" 需要它。
    • 非常感谢您的洞察力。让我省了很多麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2013-05-06
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多