win32服务启动应用程序

fangchao918628 2009-04-09 08:46:28
我想在通过写一个服务来,启动应用程序,在服务程序里用ShellExecute(),好像不行,不知道什么原因!!
...全文
422 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hd1662467836 2012-07-20
  • 打赏
  • 举报
回复
请问这个和上面的怎么联系起来?可以给我发个源码吗?谢谢:498222594@qq.com
[Quote=引用 9 楼 的回复:]

大体上是解决了,和桌面交互通过安装服务的时候通过
C/C++ code
CreateService(
schSCManager,
SVCNAME,
SVCNAME,
SERVICE_ALL_ACCESS, ……
[/Quote]
fangchao918628 2009-04-10
  • 打赏
  • 举报
回复
大体上是解决了,和桌面交互通过安装服务的时候通过
CreateService( 
schSCManager,
SVCNAME,
SVCNAME,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,//SERVICE_INTERACTIVE_PROCESS设置这样服务属性就将和桌面交互勾上,然//后试下上面说的方法
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szPath,
NULL,
NULL,
NULL,
NULL,
NULL);
fangchao918628 2009-04-09
  • 打赏
  • 举报
回复
创建进程??我想通过服务将应用程序启动!!我用的是xp sp2
cnzdgs 2009-04-09
  • 打赏
  • 举报
回复
你想用服务权限创建进程还是想用登录用户或其它用户身份创建进程?另外是什么操作系统?
jcwinner 2009-04-09
  • 打赏
  • 举报
回复
直接用计划任务启动应用程序就好了啊!
fangchao918628 2009-04-09
  • 打赏
  • 举报
回复
启动服务的时候报XX内存不可读,找了半天还是不清楚,框架是用别人的
源码如下

// FileProSer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

#define LOGFile "c:\\log.txt"

SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;

void ServiceMain();
void ControlHandler(DWORD request);

int InitService();

int WriteToLog(char* str)
{
FILE* log = fopen(LOGFile,"a+");

if(log == NULL)
return -1;
fprintf(log,"%s\n",str);
fclose(log);
return 0;

}


int InitService()
{
OutputDebugString("START");
int result;
result = WriteToLog("START");

return result;
}

void ControlHandler(DWORD request)
{

switch(request)
{
case SERVICE_CONTROL_STOP:
OutputDebugString("STOP");
WriteToLog("....STOP");

ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServiceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
OutputDebugString("STOP");
WriteToLog("....STOP");

ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServiceStatus);
return;

default:
break;

}
SetServiceStatus(hStatus,&ServiceStatus);

return;

}

void ServiceMain()//int argc,char** argv
{
int error;
ServiceStatus.dwServiceType = SERVICE_WIN32;

ServiceStatus.dwCurrentState = SERVICE_START_PENDING;

ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;

ServiceStatus.dwWin32ExitCode = 0;

ServiceStatus.dwServiceSpecificExitCode = 0;

ServiceStatus.dwCheckPoint = 0;

ServiceStatus.dwWaitHint = 0;

hStatus = RegisterServiceCtrlHandler("RunFilePro",(LPHANDLER_FUNCTION)ControlHandler);

if(hStatus == (SERVICE_STATUS_HANDLE)0)
{
return ;
}

error = InitService();

if(error)
{
ServiceStatus.dwCurrentState = SERVICE_STOPPED;

ServiceStatus.dwWin32ExitCode = -1;

SetServiceStatus(hStatus,&ServiceStatus);
}
if(ServiceStatus.dwCurrentState = SERVICE_RUNNING)
{
char achAppPath[MAX_PATH]={0};
char *pchPath=NULL;
GetModuleFileName(NULL,achAppPath,MAX_PATH);
pchPath = strrchr(achAppPath, '\\') + 1;

if (pchPath != NULL)
*pchPath = 0;

strcat(achAppPath,"XDict.exe");

ShellExecute(NULL,"open","D:\\工具软件\\金山词霸\\XDict.exe",NULL,NULL,SW_SHOWNORMAL);//achAppPath
}

}

void main()
{

SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "RunFilePro";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;

StartServiceCtrlDispatcher(ServiceTable);

}

oyljerry 2009-04-09
  • 打赏
  • 举报
回复
你服务启动的程序不能在当前桌面显示,可以先得到当前用户explorer.exe的token,然后在服务中用CreateProcessAsUser模拟当前用户启动程序..
oyljerry 2009-04-09
  • 打赏
  • 举报
回复
因为你服务启动的UI程序无法在当前桌面显示
你可以获得当前用户explorer.exe的token,然后以CreateProcessAsUser模拟当前用户启动你的程序,这样可以显示出来
fangchao918628 2009-04-09
  • 打赏
  • 举报
回复
ShellExecute(NULL,"open",achAppPath,NULL,NULL,SW_SHOWNORMAL)这个这样写有问题么?
第一个参数我设置为空!
菜牛 2009-04-09
  • 打赏
  • 举报
回复
因为一般服务没有打开桌面交互选项,也就是在system帐号下运行。可以通过服务管理器修改,也可以修改服务的运行权限。

16,466

社区成员

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

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

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