如何在windows服务里调用其它应用程序?

albert 2005-12-14 02:15:15
请问路过的大侠:小弟用ATL的向导做了个服务,这个服务定时会调用一个应用程序(比如mspaint.exe画图程序)。我试过ShellExec,CreateProcess等方法,都看不见mspaint的主界面,但是在任务管理器里却看到mspain.exe。
我把同样的调用函数放到另外一个基于Dialog的应用程序去调用,就能看见mspaint。

难道windows服务调用应用程序都不能显示出来吗?请各路大侠拔刀相助,小弟在此拜谢先!
...全文
504 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pyrophile 2005-12-22
  • 打赏
  • 举报
回复
学习
hongfei8008 2005-12-22
  • 打赏
  • 举报
回复
学习
wangk 2005-12-22
  • 打赏
  • 举报
回复
1.设置成“允许服务于桌面交互”

2.指定桌面
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);
3.你用的时候直接:
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;
}
cici2006 2005-12-22
  • 打赏
  • 举报
回复
学习
Kudeet 2005-12-22
  • 打赏
  • 举报
回复
从NT服务启动Windows程序
http://www.vckbase.com/document/viewdoc/?id=1423
Kudeet 2005-12-22
  • 打赏
  • 举报
回复
服务程序(Service)一般是不能和用户进行交互的,所以他一般是不能显示窗口的。要和用户进行交互(如显示窗口),我们必须打开用户WinSta0和desktop,参见
http://www.vckbase.com/document/viewdoc.asp?id=283
goodboyws 2005-12-22
  • 打赏
  • 举报
回复
先用LogonUser登陆,然后调用CreateProcessAsUser
或者直接用
CreateProcessWithLogonW

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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