#pragma region 包含与常量
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <tchar.h>
#include <iostream>
#include <stdlib.h>#define SVC_NAME "cservice"
#define SLEEP_TIME 5000
#define WriteToLogFILE "C:\\cservice.txt"#pragma endregion 包含与常量#pragma region Logschar* GetFormatError()
{
DWORD nErrorNo = GetLastError (); // 得到错误代码
LPSTR lpBuffer;
FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
nErrorNo, // 此乃错误代码,通常在程序中可由 GetLastError()得之
LANG_NEUTRAL,
(LPTSTR) & lpBuffer,
0 ,
NULL );
char* ret_str = lpBuffer;
// Free the buffer.
LocalFree (lpBuffer);
return ret_str;
}int WriteToLog(char* str)
{
FILE* log;
log = fopen(WriteToLogFILE, "a+");
if (log == NULL)
return -1;
fprintf(log, "%s\n", str);
fclose(log);
return 0;
}//void LOG(char *logMsg)
//{
// char buf[MAX_PATH];
// strcpy(buf,logMsg);
// sprintf(buf,"\t%s %s",logMsg,GetFormatError());
// WriteToLog(buf);
//}
#pragma endregion WriteLogsSERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
SC_HANDLE m_hSCManager = NULL;#pragma region 函数声明
void ServiceMain(int argc, char** argv); void ControlHandler(DWORD request); BOOL IsAdd(char* service_name);BOOL AddNtService(char* service_name);int RegisterService(char* service_name);void StartService(char* service_name);void StopService( char* service_name );void RemoveService( char* service_name );DWORD GetServiceStatus(char* service_name);int SCM_entry(char* service_name);
#pragma endregion 函数声明int main(int argc, char **argv)
{
WriteToLog("main()-----------------------------------------------------------------");
if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/")))
{
if(_stricmp("install",argv[1]+1)==0)
{
AddNtService(SVC_NAME);
}
else if(_stricmp("start",argv[1]+1)==0)
{
StartService(SVC_NAME);
}
else if(_stricmp("stop",argv[1]+1)==0)
{
StopService(SVC_NAME);
}
else if(_stricmp("remove",argv[1]+1)==0)
{
StopService(SVC_NAME);
RemoveService(SVC_NAME);
}
else
{
printf("usage:\n\t-install to install\n\t-start to start\n\t-stop to stop\n\t-remove to remove");
}
}
else
{
if (IsAdd(SVC_NAME))
{
SCM_entry(SVC_NAME);
}
}
return 0;
}#pragma region 函数定义
void ServiceMain(int argc, char** argv)
{
WriteToLog("ServiceMain()");
int error; ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted =
SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN |
SERVICE_ACCEPT_PAUSE_CONTINUE;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0; hStatus = RegisterServiceCtrlHandler(
"MemoryStatus",
(LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
// Registering Control Handler failed
return;
}
// We report the running status to SCM.
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus); // The worker loop of a service
while (ServiceStatus.dwCurrentState ==
SERVICE_RUNNING)
{
WriteToLog("servicemain loop");
Sleep(SLEEP_TIME);
}
return;
}void ControlHandler(DWORD request)
{
WriteToLog("ControlHandler()"); switch(request)
{
case SERVICE_CONTROL_STOP:
WriteToLog("Monitoring stopped."); ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break; case SERVICE_CONTROL_SHUTDOWN:
WriteToLog("Monitoring shutdown."); ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break; case SERVICE_CONTROL_PAUSE:
WriteToLog("Monitoring pause.");
ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break; case SERVICE_CONTROL_CONTINUE:
WriteToLog("Monitoring continue."); ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
break; default:
break;
} // Report current status
ServiceStatus.dwWin32ExitCode = 0;
SetServiceStatus (hStatus, &ServiceStatus);
WriteToLog("control return");
return;
}int RegisterService(char* service_name)
{
WriteToLog("RegisterService called\n");
if (!IsAdd(service_name))
{
AddNtService(service_name);
return 0; //if this is first running, return. and the user must entry system service start service
} SERVICE_TABLE_ENTRY ServiceTable[]=
{
{service_name,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL,NULL}
}; // Start the control dispatcher thread for our service
if (!::StartServiceCtrlDispatcher(ServiceTable) )
{
//LOG("StartServiceCtrlDispatcher faild, error code:");
}
return 0;
}BOOL AddNtService(char* service_name)
{
WriteToLog("AddNtService()");
if (m_hSCManager == NULL)
{
m_hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
} int STRLEN = _tcslen(service_name)+1;
char *m_SVC_NAME = new char[STRLEN];
_tcscpy(m_SVC_NAME, service_name); char Binary_exe[MAX_PATH];
::GetModuleFileName(NULL, Binary_exe,MAX_PATH); SC_HANDLE service = ::CreateService(
m_hSCManager,service_name,service_name,
SERVICE_ALL_ACCESS,
SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
Binary_exe,
NULL,
NULL,
_T("RPCSS\0"),
NULL,
NULL);
if (service == NULL)
{
//LOG("Create service faild error:");
return FALSE;
} WriteToLog("Create service success\n");
::CloseServiceHandle(service); return TRUE;
}BOOL IsAdd( char* service_name )
{
WriteToLog("AddOrRun()"); if (m_hSCManager == NULL)
{
m_hSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
}
SC_HANDLE hAdd = OpenService(m_hSCManager,service_name,SERVICE_ALL_ACCESS);
if (hAdd == NULL)
{
//LOG("OpenService in AddOrRun error:");
CloseServiceHandle(hAdd);
return FALSE;
}
CloseServiceHandle(hAdd); return TRUE;
}void StartService( char* service_name )
{
WriteToLog("StartService()"); // 打开服务管理对象
SC_HANDLE hSC = OpenSCManager( NULL,
NULL, GENERIC_EXECUTE);
if( hSC == NULL)
{
//LOG("open SCManager error:");
return;
} // 打开www服务。
SC_HANDLE hSvc = OpenService( hSC, service_name,
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
//LOG( "Open SVC error:");
CloseServiceHandle( hSC);
return;
} // 获得服务的状态
SERVICE_STATUS status;
if( QueryServiceStatus( hSvc, &status) == FALSE)
{
//LOG( "Get Service state error:");
CloseServiceHandle( hSvc);
//CloseServiceHandle( hSC);
return;
} if(status.dwCurrentState == SERVICE_STOPPED)
{
// 启动服务
if( ::StartService( hSvc, NULL, NULL) == FALSE)
{
//LOG( "start service error:");
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return;
} // 等待服务启动
while( ::QueryServiceStatus( hSvc, &status) == TRUE)
{
Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_RUNNING)
{
CloseServiceHandle( hSvc);
//CloseServiceHandle( hSC);
WriteToLog("Start succeed");
return;
} }
} WriteToLog( "start error。");
CloseServiceHandle( hSvc);
//CloseServiceHandle( hSC);
return;
}void StopService( char* service_name )
{
return;//待实现
}void RemoveService( char* service_name )
{
return;//待实现
}DWORD GetServiceStatus( char* service_name )
{
WriteToLog("GetServiceStatus()");
// 打开服务管理对象
if (m_hSCManager == NULL)
{
m_hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
}
if( m_hSCManager == NULL)
{
//LOG( "open SCManager error:");
return -1;
} // 打开服务。
SC_HANDLE hSvc = ::OpenService( m_hSCManager, service_name,
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
if( hSvc == NULL)
{
//LOG( "Open SVC error。");
::CloseServiceHandle( m_hSCManager);
return -1;
} // 获得服务的状态
if( ::QueryServiceStatus( hSvc, &ServiceStatus) == FALSE)
{
//LOG( "Get Service state error:");
::CloseServiceHandle( hSvc);
//::CloseServiceHandle( m_hSCManager);
return -1;
}
::CloseServiceHandle( hSvc);
char buf[MAX_PATH];
sprintf(buf,"\tGetServiceStatus returned %d",ServiceStatus.dwCurrentState);
WriteToLog(buf);
return ServiceStatus.dwCurrentState;
}int SCM_entry( char* service_name)
{
SERVICE_TABLE_ENTRY ServiceTable[]=
{
{service_name,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL,NULL}
}; // Start the control dispatcher thread for our service
if (!::StartServiceCtrlDispatcher(ServiceTable) )
{
//LOG("StartServiceCtrlDispatcher faild, error code:");
}
return 0;
}
#pragma endregion 函数定义
解决方案 »
- <object onmousedown= "test()" id="dddd" ...></object> 我的onmousedown事件怎么不触发?
- 彪悍的中国人的一天
- 深圳求职,第一次笔试,没啥希望,散分,顺便请教几个笔试题目
- 请问有谁记得在VC里自动调整格式是按什么键了?
- 请教csdn的大侠几个常识问题.
- 请问:在vc中用控件做web浏览器时怎么屏蔽右键的消息
- 如何用C/C++代码象VB那样调双接口的COM组件?
- 讨教GetProp/SetProp()两个函数的功能和用法(在线)
- VC该怎么学,大虾给点意见好不好?
- saitek的飞行摇杆编程控制
- 用OpenGL截取客户区图像,并保存为bmp图片,为灰色,求解决
- 关于视频数据,视频数据是什么
点击暂定之后报错?
我之前都是吧GetLastError的值写到log里,然后看的。