请教:关于在service中用CreateProcess创建新进程却看不到界面的问题?急!!!

freemme 2005-12-07 03:00:58
我设计了一个守护程序(是service),功能是定期检查服务器程序是否还在运行,不在运行就重启服务器。

我的服务器程序是有界面的,在本机上用service启动服务器程序,启动后是可以看到界面的。

但是当我在电信托管的机器上通过远程界面用service启动服务程序,却看不到这个界面,我注意到启动的服务器程序在'程序管理器'中的用户名是‘system’,不知道和这个有没有关系?

托管机器是windows2003,本机是winxp sp2。另外,我在局域网内通过远程桌面启动也可以看到界面。

请各位大侠帮忙解答,不胜感激!!!
...全文
392 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
idAnts 2005-12-08
  • 打赏
  • 举报
回复
你用的时候直接:
RunProcess("C:\\WINDOWS\\NOTEPAD.EXE");就可以了。
//////////////////////////////////
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
if(!lpName)
{
return FALSE;
}
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);

pe32.dwSize = sizeof(PROCESSENTRY32);

if (Process32First(hProcessSnap, &pe32))
{
do
{
if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE;

CloseHandle (hProcessSnap);
return (bRet);
}

BOOL RunProcess(LPCSTR lpImage)
{
if(!lpImage)
{
return FALSE;
}
HANDLE hToken;
if(!GetTokenByName(hToken,"EXPLORER.EXE"))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.lpDesktop = TEXT("winsta0\\default");

BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
CloseHandle(hToken);
if(bResult)
{
OutputDebugString("CreateProcessAsUser ok!\r\n");
}
else
{
OutputDebugString("CreateProcessAsUser false!\r\n");
}
return bResult;
}
孤客天涯 2005-12-08
  • 打赏
  • 举报
回复
把你的服務程序用SetThreadDesktop切換到default桌面試試,我以前也做過這樣的程序,在服務中用CreateProcess创建新进程,可以看到它的界面的.
用的就是下列方法:
PROCESS_INFORMATION pi;
STARTUPINFO sti;
ZeroMemory(&sti,sizeof(sti));
sti.cb=sizeof(sti);
sti.lpDesktop="winsta0\\default";
CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);
wangk 2005-12-08
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=202006
freemme 2005-12-08
  • 打赏
  • 举报
回复
不是服务本身,而是服务启动的进程看不见
DrSmart 2005-12-07
  • 打赏
  • 举报
回复
你要在“服务管理器”中把你的服务,在“登陆”选项卡中设置成制定成“允许服务于桌面交互”就可以看见了
freemme 2005-12-07
  • 打赏
  • 举报
回复
默认就是允许交互的
孤客天涯 2005-12-07
  • 打赏
  • 举报
回复
設置服務程序與桌面交付再試試?
freemme 2005-12-07
  • 打赏
  • 举报
回复
啟動進程時指定進程的桌面
PROCESS_INFORMATION pi;
STARTUPINFO sti;
ZeroMemory(&sti,sizeof(sti));
sti.cb=sizeof(sti);
sti.lpDesktop="winsta0\\default";
CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);

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

试过了,也不行
freemme 2005-12-07
  • 打赏
  • 举报
回复
到现场用service启动看看

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

这倒是可以试一下,是需要排除操作系统的因素
孤客天涯 2005-12-07
  • 打赏
  • 举报
回复
啟動進程時指定進程的桌面
PROCESS_INFORMATION pi;
STARTUPINFO sti;
ZeroMemory(&sti,sizeof(sti));
sti.cb=sizeof(sti);
sti.lpDesktop="winsta0\\default";
CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);
NetDNASupport 2005-12-07
  • 打赏
  • 举报
回复
becuse your service is running with the System account , if you want to show a UI to the desktop for a user, should setup the account to Administrator or other account .

Make sure you did it .
More questions can be inqured , My name is NetDNA,your best advocator
rageliu 2005-12-07
  • 打赏
  • 举报
回复
到现场用service启动看看

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧