我的OS是XP,我试着写了一个后台服务程序,main()为 void main()
{
InstallService(); SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "MLOG";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); }
整个程序可以安装成功,但启动服务时老是失败,ServiceMain()好像不执行,为什么?
{
InstallService(); SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = "MLOG";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); }
整个程序可以安装成功,但启动服务时老是失败,ServiceMain()好像不执行,为什么?
解决方案 »
- openMutex在32位系统下正常运行,在64位系统下报错
- 用opencv或者其他方法,能够快速确定一幅图片是不是全黑的
- C++类定义中为什么要分public private 和 protected
- 为什么我总是得到 0 个中文的结果?呢?
- !!如何用VC++实现作图,要能存储修改等功能(有很大难度,请教高手)!!
- 偶然发现codeguru的国家投票情况,散分,赶英超美啊....呵呵
- 关于CDC,用LineTo画线的问题
- ADO执行SQL语句三种方式比较
- VC6中compile时出现下列的错误是什么问题?
- 指针的运算符 ->和(m*).
- DLL内申请的内存,外部释放问题 希望能有专家参与
- 简单问题关于CString.Format
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
这两句对程序流程应该没有影响吧?
做两个程序,一个应用程序和一个服务程序。
应用程序先执行CreateService,再执行StartService,然后服务程序就已经启动了。
服务程序中先执行StartServiceCtrlDispatcher,然后退出。SCManager会自动调ServiceMain函数,在ServiceMain函数中需要执行RegisterServiceCtrlHandler函数,然后可以返回也可以执行其它程序。
#include <windows.h>
#include <stdio.h>#define LOGFILE "C:\\Documents and Settings\\Administrator\\桌面\\log.txt"int WriteToLog(char* str)
{
FILE* log;
log = fopen(LOGFILE, "a+");
if (log == NULL)
{
log = fopen(LOGFILE, "w+");
fprintf(log, "%s\n", str);
fclose(log);
}
fprintf(log, "%s\n", str);
fclose(log);
return 0;
}void InstallService();void main()
{
InstallService();
}void InstallService()
{
SC_HANDLE schService;
SC_HANDLE schSCManager;
TCHAR szPath[512];
//得到程序磁盘文件的路径
if(GetModuleFileName(NULL,szPath,512)==0)
{
WriteToLog("得到程序磁盘文件的路径失败!");
return;
}
//打开服务管理数据库
schSCManager=OpenSCManager(
NULL, //本地计算机
NULL, //默认的数据库
SC_MANAGER_ALL_ACCESS //要求所有的访问权
);
if(schSCManager)
{
//登记服务程序
schService=CreateService(
schSCManager,
TEXT("MLOG"),
TEXT("M LOG"),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
szPath,
NULL,
NULL,
NULL,
NULL,
NULL);
if(schService)
{
WriteToLog("服务成功安装!");
if(StartService(schService, 0, NULL) == FALSE)
{
printf("StartService failed: %dn", GetLastError());
return;
}
CloseServiceHandle(schService);
}
else
{
WriteToLog("创建服务失败!");
}
CloseServiceHandle(schSCManager);
}
else
WriteToLog("打开服务管理器失败!");
}可运行后总提示:StartService failed:1053, 服务启动不了,这是为什么啊?
我想再问一下在CreateService()函数中,它第八个参数要的是这个应用程序的路径呢还是服务程序的路径?