2010年11月5日星期五

如何在一个Service Application中运行另外一个exe文件,且可以显示在桌面上(转)

摘自:http://topic.csdn.net/t/20030117/19/1369782.html

我建立了一个Service   Application,中间有一个Thread,在一定条件下,我需要它运行另一个外部的程序。
可以当我启动服务,外部程序并没有~~显示~~的运行:在任务管理器中可以看到,但桌面上看不到显示。
我试了CreateProcess,   ShellExecute,   和WinExec都不行。

我发现在Server里调用的Process是System用户,所以我用CreateProcessAsUser,切换到当前用户,但还是没有窗口显示。

在CreateProcessAsUser中,有一个lpDesktop参数,若不指定,则继承父进程的lpDesktop,而父进程是以System登陆的。我想问题应该就出在这里。但如何才能得到当前正在使用的用户的lpDesktop呢?

----------------------

DWORD   dwLogonFlags=LOGON_WITH_PROFILE;/*LOGON_NETCREDENTIALS_ONLY;//LOGON_NETCREDENTIALS_ONLY*/
DWORD   dwCreationFlags   =   CREATE_NEW_CONSOLE   |   CREATE_NEW_PROCESS_GROUP;
        STARTUPINFOW   si2;
ZeroMemory(&si2,   sizeof(STARTUPINFOW));
si2.cb                 =   sizeof(STARTUPINFOW);
si2.lpDesktop   =   L "winsta0\\default ";
PROCESS_INFORMATION   pi2;
ZeroMemory(&pi2,sizeof(PROCESS_INFORMATION));
wchar_t*   commandline=L "c:\\progra~1\\aaa\\bbb\\test ";
BOOL   bres2=CreateProcessWithLogonW(L "masterz ",L " ",L "*** ",
dwLogonFlags,NULL,commandline,dwCreationFlags,NULL,
L "c:\\progra~1\\aaa\\bbb ",
&si2,&pi2);
if(bres2)
{
OutputDebugString( "CreateProcessWithLogonW   succeeded ");
CloseHandle(pi2.hThread);
CloseHandle(pi2.hProcess);
}

没有评论: