关于编写服务应用程序的一点总结

来源:互联网 发布:变频器仿真软件下载 编辑:程序博客网 时间:2024/04/29 17:25

@1   定义全局变量。主要为设置服务句柄和状态。

@2  添加Init初始化函数。

@3  添加安装和删除服务函数。

@4  添加服务主线程函数和控制函数。

@5  在主线程函数里注册控制函数和程序执行主体

@6  在 main主函数内注册添加安装,删除,注册主函数。


###############

大致的主函数:

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR  lpCmdLine,int  nCmdShow)
{
Init();     //调用初始化函数
dwThreadID = ::GetCurrentThreadId(); //获取当前线程ID号
SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
if (stricmp(lpCmdLine, "/install") == 0)
{
Install();
}
else if (stricmp(lpCmdLine, "/uninstall") == 0)
{
Uninstall();
}
else
{
if (!::StartServiceCtrlDispatcher(st))
{
LogEvent(_T("Register Service Main Function Error!"));
}
}
return 0;
}

#################

创建服务函数为:

SC_HANDLE CreateService(

SC_HANDLE hSCManager, //服务控制管理程序维护的登记数据库的句柄,由系统函数OpenSCManager 返回

LPCTSTR lpServiceName, //以NULL 结尾的服务名,用于创建登记数据库中的关键字

LPCTSTR lpDisplayName, //以NULL 结尾的服务名,用于用户界面标识服务

DWORD dwDesiredAccess, //指定服务返回类型

DWORD dwServiceType, //指定服务类型

DWORD dwStartType, //指定何时启动服务

DWORD dwErrorControl, //指定服务启动失败的严重程度

LPCTSTR lpBinaryPathName, //指定服务程序二进制文件的路径

LPCTSTR lpLoadOrderGroup, //指定顺序装入的服务组名

LPDWORD lpdwTagId, //忽略,NULL

LPCTSTR lpDependencies, //指定启动该服务前必须先启动的服务或服务组

LPCTSTR lpServiceStartName, //以NULL 结尾的字符串,指定服务帐号。如是NULL,则表示使用LocalSystem 帐号

LPCTSTR lpPassword //以NULL 结尾的字符串,指定对应的口令。为NULL表示无口令。但使用LocalSystem时填NULL

);

#################

打开服务函数为:

SC_HANDLE WINAPI OpenService(  _In_  SC_HANDLE hSCManager,  _In_  LPCTSTR lpServiceName,  _In_  DWORD dwDesiredAccess);


具体详略查看MSDN文档。

##################

 停止服务函数为:

BOOL WINAPI ControlService(
  _In_   SC_HANDLE hService,
  _In_   DWORD dwControl,
  _Out_  LPSERVICE_STATUS lpServiceStatus
);

删除服务函数为:

BOOL WINAPI DeleteService(
  _In_  SC_HANDLE hService
);




0 0
原创粉丝点击