控制台程序转成windows 服务简单的辅助代码
2008-10-21 17:42
459 查看
#ifndef daemon_h
#define daemon_h
#include <windows.h>
static SERVICE_STATUS daemon_status;;
static SERVICE_STATUS_HANDLE daemon_handle;
static DWORD deamon_argc;
static char** daemon_argv;
extern const char* daemon_name;
static void WINAPI daemon_ctrl(DWORD dwControl){
switch (dwControl){
case SERVICE_CONTROL_PAUSE:
daemon_status.dwCurrentState = SERVICE_PAUSE_PENDING;
SetServiceStatus(daemon_handle, &daemon_status);
daemon_status.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
daemon_status.dwCurrentState = SERVICE_CONTINUE_PENDING;
SetServiceStatus(daemon_handle, &daemon_status);
daemon_status.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
daemon_status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(daemon_handle, &daemon_status);
daemon_status.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
case SERVICE_CONTROL_INTERROGATE:
daemon_status.dwCurrentState = SERVICE_RUNNING;
break;
}
SetServiceStatus(daemon_handle, &daemon_status);
}
static int daemon_initialize(){
daemon_status.dwServiceType = SERVICE_WIN32;
daemon_status.dwCurrentState = SERVICE_START_PENDING;
daemon_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
daemon_status.dwWin32ExitCode = 0;
daemon_status.dwServiceSpecificExitCode = 0;
daemon_status.dwCheckPoint = 0;
daemon_status.dwWaitHint = 0;
daemon_handle = RegisterServiceCtrlHandler(daemon_name, daemon_ctrl);
if(daemon_handle == 0){
return -1;
}
daemon_status.dwCheckPoint = 0;
daemon_status.dwWaitHint = 0;
daemon_status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(daemon_handle, &daemon_status);
return 0;
}
#define main /
main(int argc, char* argv[]){ /
deamon_argc = argc; /
daemon_argv = argv; /
void WINAPI daemon_wrapper(DWORD argc, char* argv[]); /
SERVICE_TABLE_ENTRY service_table_entry[] = /
{ /
{(char *) daemon_name, daemon_wrapper}, /
{0, 0} /
}; /
StartServiceCtrlDispatcher(service_table_entry); /
} /
/
void WINAPI daemon_wrapper(DWORD argc, char* argv[]){ /
if(-1 == daemon_initialize()){ /
return; /
} /
extern int daemon_main(int argc, char* argv[]); /
daemon_main((int) deamon_argc, daemon_argv); /
} /
int daemon_main
#endif
#define daemon_h
#include <windows.h>
static SERVICE_STATUS daemon_status;;
static SERVICE_STATUS_HANDLE daemon_handle;
static DWORD deamon_argc;
static char** daemon_argv;
extern const char* daemon_name;
static void WINAPI daemon_ctrl(DWORD dwControl){
switch (dwControl){
case SERVICE_CONTROL_PAUSE:
daemon_status.dwCurrentState = SERVICE_PAUSE_PENDING;
SetServiceStatus(daemon_handle, &daemon_status);
daemon_status.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
daemon_status.dwCurrentState = SERVICE_CONTINUE_PENDING;
SetServiceStatus(daemon_handle, &daemon_status);
daemon_status.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
daemon_status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(daemon_handle, &daemon_status);
daemon_status.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
case SERVICE_CONTROL_INTERROGATE:
daemon_status.dwCurrentState = SERVICE_RUNNING;
break;
}
SetServiceStatus(daemon_handle, &daemon_status);
}
static int daemon_initialize(){
daemon_status.dwServiceType = SERVICE_WIN32;
daemon_status.dwCurrentState = SERVICE_START_PENDING;
daemon_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
daemon_status.dwWin32ExitCode = 0;
daemon_status.dwServiceSpecificExitCode = 0;
daemon_status.dwCheckPoint = 0;
daemon_status.dwWaitHint = 0;
daemon_handle = RegisterServiceCtrlHandler(daemon_name, daemon_ctrl);
if(daemon_handle == 0){
return -1;
}
daemon_status.dwCheckPoint = 0;
daemon_status.dwWaitHint = 0;
daemon_status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(daemon_handle, &daemon_status);
return 0;
}
#define main /
main(int argc, char* argv[]){ /
deamon_argc = argc; /
daemon_argv = argv; /
void WINAPI daemon_wrapper(DWORD argc, char* argv[]); /
SERVICE_TABLE_ENTRY service_table_entry[] = /
{ /
{(char *) daemon_name, daemon_wrapper}, /
{0, 0} /
}; /
StartServiceCtrlDispatcher(service_table_entry); /
} /
/
void WINAPI daemon_wrapper(DWORD argc, char* argv[]){ /
if(-1 == daemon_initialize()){ /
return; /
} /
extern int daemon_main(int argc, char* argv[]); /
daemon_main((int) deamon_argc, daemon_argv); /
} /
int daemon_main
#endif
相关文章推荐
- C#控制台程序实现开启、关闭SQLServer服务的代码分享
- Linux程序代码移植到Windows的简单方法(转)
- asp.net web api的自托管模式HttpSelfHostServer可以以控制台程序或windows服务程序为宿主,不单单依赖于IIS web服务器
- 如何用 C 注册 windows 服务程序 (分析 Java Service Wrapper 代码)
- windows控制台程序获取中断的简单程序
- 最简单的Windows窗口程序,使用main函数,隐藏控制台等,适合window编程入门
- 用C#写一个简单的WINDOWS服务程序
- 简单的windows服务编程框架(MSDN例子代码)
- 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码
- 用C#写一个简单的WINDOWS服务程序
- 用C#创建简单的windows服务程序
- C# Windows 服务 的简单程序的编写,安装 和 卸载
- 基于Python编写的Windows服务程序参考代码
- 如何让自己的应用程序,控制台程序,windows 服务收到操作系统注销或者重启的消息
- 用C#写一个简单的WINDOWS服务程序
- Tips: 如何让自己的应用程序,控制台程序,windows 服务收到操作系统注销或者重启的消息?
- 用C#写一个简单的WINDOWS服务程序
- Linux程序代码移植到Windows的简单方法[转摘]
- 代码量化 -Windows服务程序建立步骤(2010-12-29)
- 基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序