windows服务编程的疑问?请教,谢谢

liuhaibao 2004-04-20 10:42:29
源码:
#include "stdafx.h"
#include "stdlib.h"
#include "Tlhelp32.h"

char * servicename = "network management control module";
char * processname = "QQ.exe";
char * file = "d:\\relax\\Tencent\\Tencent\\QQ.exe";

char * GetFilePathName();

BOOL Query(const char * servicename);

BOOL RegisterService(const char * servicename);

DWORD WINAPI monitor(LPVOID param);

extern "C" int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow);


VOID WINAPI Handler( DWORD fdwControl )
{
/*
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
serviceStatus.dwCurrentState =SERVICE_STOPPED;
SetServiceStatus (hServiceStatus,&serviceStatus);
break;
case SERVICE_CONTROL_CONTINUE:
serviceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hServiceStatus,&serviceStatus);
break;
case SERVICE_CONTROL_PAUSE:
serviceStatus.dwCurrentState = SERVICE_PAUSED;
SetServiceStatus (hServiceStatus,&serviceStatus);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
SetServiceStatus (hServiceStatus,&serviceStatus);
*/

}

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
SERVICE_STATUS_HANDLE ssh = RegisterServiceCtrlHandler(servicename,&Handler);
SERVICE_STATUS ss;
ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwControlsAccepted = 0;
ss.dwWin32ExitCode = NO_ERROR;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);

void * pname = (void *)processname;
DWORD id ;
CreateThread(NULL,0,monitor,pname,0,&id);

ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
ss.dwCurrentState = SERVICE_STOPPED;
ss.dwControlsAccepted = 0;
ss.dwWin32ExitCode = NO_ERROR;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);


}





int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
// TODO: Place code here.
if(!Query(servicename))
{
if(RegisterService(servicename))
{
MessageBox(NULL,"已经注册服务","已经注册服务",0);
}
}

SERVICE_TABLE_ENTRY ste[2];
ste[0].lpServiceName = servicename;
ste[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ste[1].lpServiceName = NULL;
ste[1].lpServiceProc = NULL;
if(StartServiceCtrlDispatcher(ste))
{
MessageBox(NULL,"开始运行","开始运行",0);
//return 0;
}
else
{
MessageBox(NULL,"运行失败","运行失败",0);
return 0;

}

SC_HANDLE scm = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if(scm!=NULL)
{
SC_HANDLE svc = OpenService(scm,servicename,SERVICE_START);
if(svc!=NULL)
{
if(StartService(svc,0,NULL))
{
CloseServiceHandle(svc);
CloseServiceHandle(scm);
MessageBox(NULL,"开始运行","开始运行",0);
//return 0;
}
else
{
CloseServiceHandle(svc);
CloseServiceHandle(scm);
MessageBox(NULL,"运行失败","运行失败",0);
return 0;
}
}
else
{
CloseServiceHandle(scm);
MessageBox(NULL,"运行失败","运行失败",0);
return 0;
}

}
return 0;
}

BOOL Query(const char * servicename)
{
SC_HANDLE scm = NULL;
char buf[256];
DWORD out = 256;
scm = OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
if(GetServiceDisplayName(scm,servicename,buf,&out))
{
CloseServiceHandle(scm);
return TRUE;
}
else
{
CloseServiceHandle(scm);
return FALSE;
}
}

BOOL RegisterService(const char * servicename)
{

SC_HANDLE scm = NULL;
SC_HANDLE svc = NULL;
char buf[1024];

scm = OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
if(scm)
{
char * filename = GetFilePathName();
wsprintf(buf,"\"%s\"",filename);
svc = CreateService(scm,
servicename,
servicename,
0,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
buf,
NULL,
NULL,
NULL,
NULL,
NULL);
if(svc)
{
CloseServiceHandle(svc);
CloseServiceHandle(scm);
return TRUE;
}
else
{
CloseServiceHandle(svc);
return FALSE;
}
}
else
{
return FALSE;
}

return TRUE;

}

char * GetFilePathName()
{

char * name = GetCommandLine();
int len = strlen(name) + 1;
char * filename = (char *) malloc(sizeof(char)*len);
memset(filename,0,len);
strcat(filename,name);
return filename;

}


DWORD WINAPI monitor(LPVOID param)
{

char * name = (char *)param;
HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 ProcessInfo;
ProcessInfo.dwSize = sizeof(PROCESSENTRY32);
BOOL find ;

DWORD ret;
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_FORCEOFFFEEDBACK;

find = Process32First(SnapShot,&ProcessInfo);
while(!find)
{
if(strcmp(ProcessInfo.szExeFile ,name)==0)
{
find = TRUE;
break;
}
else
{
find = Process32Next(SnapShot,&ProcessInfo);
}
}
if(!find)
{
CreateProcess(file,NULL,NULL,NULL,0,0,NULL,NULL,&si,&pi);
while(1)
{
DWORD ret;
ret = WaitForSingleObject(pi.hProcess ,INFINITE);
if(ret==WAIT_OBJECT_0)
{
CreateProcess(file,NULL,NULL,NULL,0,0,NULL,NULL,&si,&pi);
}
}

}
else
{
HANDLE process = OpenProcess(0,NULL,ProcessInfo.th32ProcessID);
while(1)
{
ret = WaitForSingleObject(process ,INFINITE);
if(ret==WAIT_OBJECT_0)
{
CreateProcess(file,NULL,NULL,NULL,0,0,NULL,NULL,&si,&pi);
}
}
}

return 0;

}
参考了一些资料但是不晓得为什么,总是启动服务的时候失败,希望能有一个原因,为什么?错在哪里,谢谢!!!
...全文
52 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhaibao 2004-04-20
  • 打赏
  • 举报
回复
没人回答?
liuhaibao 2004-04-20
  • 打赏
  • 举报
回复
3x
oyd(cplusplus说的两个错误,确实,现在以更正,谢谢仁兄!!!
oyd 2004-04-20
  • 打赏
  • 举报
回复
你的程序有两个错误:
1。BOOL RegisterService(const char * servicename)
{
//...
char * filename = GetFilePathName();
wsprintf(buf,"\"%s\"",filename);
这里弄巧成拙的多加了一层"",结果服务管理器找不到你的你注册的程序

2。DWORD WINAPI monitor(LPVOID param)
{
//。。。
find = Process32First(SnapShot,&ProcessInfo);
while(!find)
{
if(strcmp(ProcessInfo.szExeFile ,name)==0)
{
find = TRUE;
break;
}
else
{
find = Process32Next(SnapShot,&ProcessInfo);
}
}
if(!find)
{//。。。
这里你列举进程和匹配居然用同一个flag,晕~~~

3。int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
//。。。
SC_HANDLE scm = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if(scm!=NULL)
{//。。。
已经作为服务启动了,你却又把自己启动一遍,莫名其妙。造成的结果就是崩溃。




zhouqingyuan 2004-04-20
  • 打赏
  • 举报
回复
看来爱莫能助了,StartServiceCtrlDispatcher(ste)返回0,可用GetLastError()却
查不到错误。
zhouqingyuan 2004-04-20
  • 打赏
  • 举报
回复
晕了,用GetLastError()查的是操作成功完成。
sharkhuang 2004-04-20
  • 打赏
  • 举报
回复
markmark
zhouqingyuan 2004-04-20
  • 打赏
  • 举报
回复
在看!!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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