2013-03-07 36 views
1

如果我作为网络服务运行,如何使用提供的参数启动可执行文件?我使用的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”)也是如此。

我知道这是匆忙编写的代码,但我需要看看运行的网络服务(如我的)是否可以成功地执行此操作。当我作为另一个用户运行它时(通过双击可执行文件)它似乎工作得很好。

+0

你期待什么发生?当然,新进程在创建过程的登录下运行。 – 2013-03-08 00:18:07

+2

您是否尝试过使用'CreateProcess'? – 2013-03-08 01:21:08

+0

没有CreateProcess的运气。我会尝试CreateProcessWithLogonW。 – KKP 2013-03-08 22:01:31

回答

4

您的服务在会话0中运行。您的交互式桌面处于不同的会话中。所以当你的服务开始一个过程时,你什么也看不到。因为它在会话0中与服务在同一会话中启动。

如果希望服务在交互式桌面上启动进程,尽管这很困难:Launching an interactive process from Windows Service in Windows Vista and later

+0

感谢您的回答。如果我不需要交互,那会怎么样?例如,从命令行(使用system()或ShellExecuteEx()调用或从cmd直接运行它时,“Notmyfault.exe -crash”不是交互式的。我的进程被调用 - 我使用TaskMgr看到它 - 它只是没有运行它的参数(-crash或-help,-help无疑是交互式的,但-crash不应该)或者我误解了“交互式桌面”的含义? – KKP 2013-03-08 01:32:19

+0

如何检测其他进程收到参数? – 2013-03-08 07:13:54

+0

我用procmon看它是如何启动的,看起来像是给出了完整的命令,但我不确定它是挂起还是只是没有收到参数。我应该尝试CreateProcessWithLogonW吗? – KKP 2013-03-08 16:24:51

相关问题