为什么服务程序CreateProcess不能显示窗体?

zwl19879775 2012-12-28 11:25:21
我做了一个服务程序来监控某个程序A,被监控的程序A如果意外关闭了或者开机时都会被服务程序重新执行运行。那个被监控程序A是一个控制台程序,但是用服务程序启动的话,会发现A的进程可以任务管理器中看到,但是没有控制台的界面,试着更改CreateProcess的参数,但无论如何都没办法显示出A的控制台界面???
...全文
902 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-01-10
  • 打赏
  • 举报
回复
让你的服务可以和桌面交互
这不是鸭头 2013-01-10
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/300162655我记得这个问题,在CSDN里前几天还看见了....
tyong 2013-01-10
  • 打赏
  • 举报
回复
参考一下代码,需要调整。
主要是默认活动桌面的调整。
BOOL RunRemoteControl()
{
HANDLE hToken;
HDESK hdesk;
HWINSTA hwinsta;
PROCESS_INFORMATION pi;
STARTUPINFO si;

//HANDLE hExp = GetProcessHandle(L"EXPLORER.EXE");
HANDLE hExp = CToolFunction::GetProcessHandle(L"Winlogon.exe");
while (hExp == NULL)
{
hExp = CToolFunction::GetProcessHandle(L"Winlogon.exe");
Sleep(100);
}

OpenProcessToken(hExp, TOKEN_ALL_ACCESS, &hToken);
if(hToken == NULL)
{
return FALSE;
}

HWND hDesk = GetDesktopWindow();
// BOOL bOk = ImpersonateLoggedOnUser(hToken);
// GenericLog(Info,"ImpersonateLoggedOnUser %s",bOk?"Ok":"Failed");
//GenericLog(Info,"Desktop HWND %s",(hDesk == GetDesktopWindow())?"Equal":"Not Equal");

// obtain a handle to the interactive windowstation
hwinsta = OpenWindowStation( _T("winsta0"), FALSE, READ_CONTROL|WRITE_DAC );
if (hwinsta == NULL)
{
return FALSE;
}

HWINSTA hwinstaold = GetProcessWindowStation();
if (!SetProcessWindowStation(hwinsta))
{
return FALSE;
}

// obtain a handle to the "default" desktop
hdesk = OpenDesktop(
_T("Winlogon"),
0,
FALSE,
READ_CONTROL | WRITE_DAC |
DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS
);
if (hdesk == NULL)
{
return FALSE;
}

// close the handles to the interactive windowstation and desktop
CloseWindowStation(hwinsta);
CloseDesktop(hdesk);

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

TCHAR szParameter[10] = {0};
if(CreateProcessAsUser(hToken, CToolFunction::oGetCurPath()+_T("\\Server.exe"), szParameter, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}

SetProcessWindowStation(hwinstaold);

return TRUE;
}
dibotiger 2013-01-09
  • 打赏
  • 举报
回复
上面的这些回复 在2K/XP下有效,因为2K/XP的服务和用户进程在同一个session里,没有隔绝. vista以后,服务和用户进程在不同一个session里,会话隔绝.微软提供的方式为: CreateProcessAsUser, 可自行搜索下.
潇潇雨云 2012-12-31
  • 打赏
  • 举报
回复
设置允许服务与桌面交互
孤客天涯 2012-12-31
  • 打赏
  • 举报
回复
你服务程序先要设置允许服务与桌面交互,同时CreateProcess参数 设置成sti.lpDesktop="winsta0\\default";指定默认的用户桌面
看不见的裂痕 2012-12-28
  • 打赏
  • 举报
回复
1. 在控制面板-管理工具-服务,找到你的服务,右键属性,在登陆属性页里,把允许服务与桌面交互钩上 2. 尝试使用 CreateProcessAsUser 单位网络有问题饿,发了3次了
Eleven 2012-12-28
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/300162655
zwl19879775 2012-12-28
  • 打赏
  • 举报
回复
呵呵,貌似服务CreateProcess的进程界面不在当前用户Explorer中显示的
yaozhiyong110 2012-12-28
  • 打赏
  • 举报
回复
STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(STARTUPINFO); si.wShowWindow=SW_SHOW; PROCESS_INFORMATION pi; ZeroMemory(&pi,sizeof(pi)); CreateProcess(pPath/*exe全路径*/,NULL, NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
zwl19879775 2012-12-28
  • 打赏
  • 举报
回复
引用 1 楼 yaozhiyong110 的回复:
STARTUPINFO si = {0}; si.wShowWindow = SW_SHOWWINDOW;
STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; BOOL bRet = CreateProcess(NULL, (LPSTR)app_path, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi); 这是我的代码,貌似这样是不行的
yaozhiyong110 2012-12-28
  • 打赏
  • 举报
回复
STARTUPINFO si = {0}; si.wShowWindow = SW_SHOWWINDOW;

15,467

社区成员

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

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