c++ - 作为网络服务运行时使用参数启动可执行文件

标签 c++ windows winapi shell process

如果我作为网络服务运行,如何使用提供的参数启动可执行文件?我尝试在我的程序(作为网络服务运行)中使用 ShellExecuteEx:

try
{

    DWORD dwErr;
    TCHAR bufProgName[1000] = _T("");
    TCHAR bufParameters[1000] = _T("");

    ::lstrcat(bufProgName,_T("C:\\NotMyFault\\x86\\NotMyFault.exe"));
    ::lstrcat(bufParameters,_T(" -help"));

    SHELLEXECUTEINFO ShExecInfo;
    ZeroMemory(&ShExecInfo,sizeof(ShExecInfo));
    ShExecInfo.cbSize=sizeof(ShExecInfo);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = NULL;
    ShExecInfo.lpFile = bufProgName;        
    ShExecInfo.lpParameters = bufParameters;
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_SHOWNORMAL;
    ShExecInfo.hInstApp = NULL; 
    int res = ShellExecuteEx(&ShExecInfo);
    if(!res)
    {
        dwErr = GetLastError();
        return -1;
    }

}
catch(...)
{
    std::cout<<"ShellFail: " << dwError;
    return -1;

}

但所有这一切只是启动 NotMyFault.exe 作为用户网络服务运行(我从任务管理器中看到它),但它没有提供帮助。其他参数(“-crash”)也是如此。

我知道这是仓促编写的代码,但我需要查看作为网络服务运行的进程(如我的)是否可以成功执行此操作。当我以另一个用户身份运行它时(通过双击可执行文件),它似乎工作正常。

最佳答案

您的服务在 session 0 中运行。您的交互式桌面在不同的 session 中。因此,当您的服务启动一个进程时,您将看不到任何东西。因为它与服务在同一个 session 中启动,在 session 0 中。

如果您希望服务在交互式桌面上启动一个进程,那是可能的,尽管很困难:Launching an interactive process from Windows Service in Windows Vista and later .

关于c++ - 作为网络服务运行时使用参数启动可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15284212/

相关文章:

c++ - 如何有效地将 vector 重复到cuda中的矩阵?

c++ - 为给定的字符串生成所有可能的回文

windows - 如何捕获 Windows 消息?

javascript - html网页在不同浏览器中的变化

c - 在 Windows 和 *nix 系统上解析共享库路径

winapi - RECTL 和 RECT 有什么区别?

c - 如何模拟对任何当前聚焦的窗口的按键操作?

c++ - 如何在 Visual Basic 中使用矩形函数 OpenGL 绘制矩形

c++ - 如何找出WSD打印机的IP地址?我想使用 WSD API,但无法使用 IWSDDiscoveredDevice

windows - Windows 用户模拟有哪些副作用?