#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
#define SLEEP_TIME 5000
#define FILE_PATH "C:\\log.txt"
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
void WINAPI ServiceMain(int argc, char** argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
int WriteToLog(const char* str);
BOOL InstallCmdService();
void DelService();
BOOL bRuning = TRUE;
int main(int argc,char *argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[2];
if (argc == 2)
{
if (!_stricmp(argv[1], "-i"))
{
InstallCmdService();
}
else if (!_stricmp(argv[1], "-r"))
{
DelService();
}
return 0;
}
DispatchTable[0].lpServiceName = (LPWSTR)"demo";
DispatchTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
DispatchTable[1].lpServiceName = NULL;
DispatchTable[1].lpServiceProc = NULL;
StartServiceCtrlDispatcher(DispatchTable);
return 0;
}
int WriteToLog(const char* str)
{
FILE* pfile;
fopen_s(&pfile, FILE_PATH, "a+");
if (pfile == NULL)
{
return -1;
}
else
{
fprintf_s(pfile, "%s\n", str);
fclose(pfile);
return 0;
}
}
void WINAPI ServiceMain(int argc, char** argv)
{
MEMORYSTATUSEX memstatus;
memstatus.dwLength = sizeof(memstatus);
char str[100];
int availmb;
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = RegisterServiceCtrlHandler((LPWSTR)"demo", ServiceCtrlHandler);
if (m_ServiceStatusHandle == 0)
{
WriteToLog("RegisterServiceCtrlHandle failed");
return;
}
WriteToLog("RegisterServiceCtrlHandle success");
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
bRuning = TRUE;
memset(str, '\0', 100);
while (bRuning)
{
GlobalMemoryStatusEx(&memstatus);
availmb = int(memstatus.ullAvailPhys / 1024 / 1024);
sprintf_s(str, 100, "available memory is %dMB", availmb);
WriteToLog(str);
Sleep(SLEEP_TIME);
}
WriteToLog("service stopped");
}
void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
switch (Opcode)
{
case SERVICE_CONTROL_STOP:
{
bRuning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
}
case SERVICE_CONTROL_SHUTDOWN:
{
bRuning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
}
default:
break;
}
SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
}
BOOL InstallCmdService()
{
DWORD dw;
char strDir[1024];
SC_HANDLE schSCManager, schService;
LPCWSTR lpszBinaryPathName;
GetCurrentDirectory(1024, LPWSTR(strDir));
GetModuleFileName(NULL, LPWSTR(strDir), sizeof(strDir));
lpszBinaryPathName =LPCWSTR (strDir);
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
{
printf("open scmanager failed,maybe you do not have the previlage to do this \n");
return FALSE;
}
schService = CreateService(schSCManager, LPCWSTR("demo"), LPCWSTR("demo demo..."), SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL);
dw = GetLastError();
if (schService == NULL)
{
//程序卡到这一行,返回的句柄为空,不知道为什么创建服务失败,懂得大哥帮我看看,找了很多资料,都找不到原因,我用getlasterror 获取错误代码1073 显示服务已存在,但是我打开服务程序没有看到demo这个服务。如果用sc命令工具没有问题,用命令行参数在创建服务的时候失败了。求大哥门指点一下,萌新一个,讲的通俗一点。谢谢大家
printf("faint, we failed just becanuse we invoke createservice failed error number:%d\n",dw);
return FALSE;
}
CloseServiceHandle(schService);
return TRUE;
}
void DelService()
{
char name[100];
SC_HANDLE scm;
SC_HANDLE service;
SERVICE_STATUS status;
BOOL isSuccess = FALSE;
strcpy_s(name, "demo");
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL)
{
printf("OpenSCManager Error");
return;
}
service = OpenService(scm, LPCWSTR(name), SERVICE_ALL_ACCESS | DELETE);
if (!service)
{
printf("OpenService error!");
return;
}
QueryServiceStatus(service, &status);
if (!isSuccess)
{
printf("QueryServiceStatus error!");
return;
}
if (status.dwCurrentState != SERVICE_STOPPED)
{
isSuccess = ControlService(service, SERVICE_CONTROL_STOP, &status);
if (!isSuccess)
{
printf("Stop Service error!");
return;
}
}
isSuccess = DeleteService(service);
if (!isSuccess)
{
printf("Dlete Service Fail!");
}
else
{
printf("Delete Service Success!");
}
CloseServiceHandle(service);
CloseServiceHandle(scm);
}
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
#define SLEEP_TIME 5000
#define FILE_PATH "C:\\log.txt"
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
void WINAPI ServiceMain(int argc, char** argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
int WriteToLog(const char* str);
BOOL InstallCmdService();
void DelService();
BOOL bRuning = TRUE;
int main(int argc,char *argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[2];
if (argc == 2)
{
if (!_stricmp(argv[1], "-i"))
{
InstallCmdService();
}
else if (!_stricmp(argv[1], "-r"))
{
DelService();
}
return 0;
}
DispatchTable[0].lpServiceName = (LPWSTR)"demo";
DispatchTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
DispatchTable[1].lpServiceName = NULL;
DispatchTable[1].lpServiceProc = NULL;
StartServiceCtrlDispatcher(DispatchTable);
return 0;
}
int WriteToLog(const char* str)
{
FILE* pfile;
fopen_s(&pfile, FILE_PATH, "a+");
if (pfile == NULL)
{
return -1;
}
else
{
fprintf_s(pfile, "%s\n", str);
fclose(pfile);
return 0;
}
}
void WINAPI ServiceMain(int argc, char** argv)
{
MEMORYSTATUSEX memstatus;
memstatus.dwLength = sizeof(memstatus);
char str[100];
int availmb;
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = RegisterServiceCtrlHandler((LPWSTR)"demo", ServiceCtrlHandler);
if (m_ServiceStatusHandle == 0)
{
WriteToLog("RegisterServiceCtrlHandle failed");
return;
}
WriteToLog("RegisterServiceCtrlHandle success");
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
bRuning = TRUE;
memset(str, '\0', 100);
while (bRuning)
{
GlobalMemoryStatusEx(&memstatus);
availmb = int(memstatus.ullAvailPhys / 1024 / 1024);
sprintf_s(str, 100, "available memory is %dMB", availmb);
WriteToLog(str);
Sleep(SLEEP_TIME);
}
WriteToLog("service stopped");
}
void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
switch (Opcode)
{
case SERVICE_CONTROL_STOP:
{
bRuning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
}
case SERVICE_CONTROL_SHUTDOWN:
{
bRuning = FALSE;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
break;
}
default:
break;
}
SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
}
BOOL InstallCmdService()
{
DWORD dw;
char strDir[1024];
SC_HANDLE schSCManager, schService;
LPCWSTR lpszBinaryPathName;
GetCurrentDirectory(1024, LPWSTR(strDir));
GetModuleFileName(NULL, LPWSTR(strDir), sizeof(strDir));
lpszBinaryPathName =LPCWSTR (strDir);
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
{
printf("open scmanager failed,maybe you do not have the previlage to do this \n");
return FALSE;
}
schService = CreateService(schSCManager, LPCWSTR("demo"), LPCWSTR("demo demo..."), SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL);
dw = GetLastError();
if (schService == NULL)
{
//程序卡到这一行,返回的句柄为空,不知道为什么创建服务失败,懂得大哥帮我看看,找了很多资料,都找不到原因,我用getlasterror 获取错误代码1073 显示服务已存在,但是我打开服务程序没有看到demo这个服务。如果用sc命令工具没有问题,用命令行参数在创建服务的时候失败了。求大哥门指点一下,萌新一个,讲的通俗一点。谢谢大家
printf("faint, we failed just becanuse we invoke createservice failed error number:%d\n",dw);
return FALSE;
}
CloseServiceHandle(schService);
return TRUE;
}
void DelService()
{
char name[100];
SC_HANDLE scm;
SC_HANDLE service;
SERVICE_STATUS status;
BOOL isSuccess = FALSE;
strcpy_s(name, "demo");
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE)) == NULL)
{
printf("OpenSCManager Error");
return;
}
service = OpenService(scm, LPCWSTR(name), SERVICE_ALL_ACCESS | DELETE);
if (!service)
{
printf("OpenService error!");
return;
}
QueryServiceStatus(service, &status);
if (!isSuccess)
{
printf("QueryServiceStatus error!");
return;
}
if (status.dwCurrentState != SERVICE_STOPPED)
{
isSuccess = ControlService(service, SERVICE_CONTROL_STOP, &status);
if (!isSuccess)
{
printf("Stop Service error!");
return;
}
}
isSuccess = DeleteService(service);
if (!isSuccess)
{
printf("Dlete Service Fail!");
}
else
{
printf("Delete Service Success!");
}
CloseServiceHandle(service);
CloseServiceHandle(scm);
}