您的位置:首页 > 其它

编写windows服务程序

2016-01-13 19:11 381 查看
初学VC,写了一个最简单的服务程序,windows API 真心太多了,留作笔记。以后说不定改改还能用上。

编译后生成exe文件:

test.exe -i   //安装服务

test.exe -r   //删除服务

while循环中写自己的逻辑。

**注意!! 每次代码改变服务状态后一定表忘记SetServiceStatus一下,不然真报错不商量。

#include <Windows.h>
#include <stdio.h>

BOOL flag = TRUE;
void WINAPI ServiceMain(DWORD argc, LPSTR** argv);
void WINAPI sHandler(DWORD request);
BOOL installService();
BOOL unInstallService();

SERVICE_STATUS m_Status;
SERVICE_STATUS_HANDLE m_Handle;

int main(int argc,char* argv[])
{

if (argc==2)
{
if (!_stricmp(argv[1],"-i"))
{
installService();
}
else if(!_stricmp(argv[1],"-r"))
{
unInstallService();
}
return 0;
}

SERVICE_TABLE_ENTRY table[2];
table[0].lpServiceName = "AAA";
table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
table[1].lpServiceName = NULL;
table[1].lpServiceProc = NULL;

StartServiceCtrlDispatcher(table);

}

void WINAPI ServiceMain(DWORD argc, LPSTR ** argv)
{
m_Status.dwCheckPoint = 0;
m_Status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
m_Status.dwCurrentState = SERVICE_START_PENDING;
m_Status.dwServiceSpecificExitCode = 0;
m_Status.dwServiceType = SERVICE_WIN32;
m_Status.dwWaitHint = 0;
m_Status.dwWin32ExitCode = 0;

m_Handle = RegisterServiceCtrlHandler("AAA",sHandler);

if (m_Handle!=0)
{
m_Status.dwCurrentState = SERVICE_RUNNING;
}
SetServiceStatus(m_Handle, &m_Status);
while (flag)
{
FILE *fp;
fp = fopen("c:\\demo\\test.txt", "a+");
fputs("test data!\r\n",fp);
fclose(fp);
Sleep(10000);
}
CloseServiceHandle(m_Handle);
}

void WINAPI sHandler(DWORD request)
{
switch (request)
{
case SERVICE_CONTROL_STOP:
flag = FALSE;
m_Status.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_CONTROL_SHUTDOWN:
flag = FALSE;
m_Status.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}

SetServiceStatus(m_Handle, &m_Status);
}

BOOL installService()
{
SC_HANDLE scHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (scHandle==NULL)
{
printf("openSCManager failed!");
return FALSE;
}
scHandle = CreateService(scHandle, "AAA", NULL, SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, "c:\\demo\\AAA.exe", NULL, NULL, NULL, NULL, NULL);

if (scHandle == NULL)
{
printf("createService failed!");
return FALSE;
}
printf("createService success!\r\n");

if (StartService(scHandle, NULL, NULL))
{
printf("start service success!\r\n");
}
else
{
printf("start failed!");
}
CloseServiceHandle(scHandle);
return TRUE;
}

BOOL unInstallService()
{
SC_HANDLE scm, m_service;
SERVICE_STATUS unStatus;
scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (scm==NULL)
{
printf("openscmanage failed!");
return FALSE;
}
else
{
m_service = OpenService(scm, "AAA", SC_MANAGER_ALL_ACCESS);
if (m_service==NULL)
{
printf("openservice failed!");
return FALSE;
}
else
{
if (QueryServiceStatus(m_service, &unStatus))
{
if (unStatus.dwCurrentState!=SERVICE_STOPPED)
{
if (!ControlService(m_service, SERVICE_CONTROL_STOP, &unStatus))
{
printf("controlservice stop failed!");
return FALSE;
}
}
if (DeleteService(m_service))
{
printf("Delete success!");
}
else
{
printf("Delete failed!");
return FALSE;
}
}
else
{
printf("Queryservice failed!");
return FALSE;
}
}
}

return TRUE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: