Windows服务编程
Windows服务编程
我们看到有什么60主动防御服务,Google更新服务等,我们也写个简单的服务吧代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
#include <windows.h>
//毫秒
#define SLEEP_TIME 1000
#define FILE_PATH "D:\\test.txt&qu
Windows服务编程
我们看到有什么60主动防御服务,Google更新服务等,我们也写个简单的服务吧
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
#include <windows.h>
//毫秒
#define SLEEP_TIME 1000
#define FILE_PATH "D:\\"
//服务状态
SERVICE_STATUS m_ServiceState;
//服务状态句柄
SERVICE_STATUS_HADLE m_ServiceHandle;
void WIAPI ServiceMain(int argc, char** ar);
void WIAPI ServiceCtrlHandler(DWORD Opcode);
int WriteToLog(char* str);
BOOL bRunning;
int main() {
SERVICE_TABLE_ETRY stentry[2];
stentry[0].lpServiceame = "demo";
stentry[0].lpServiceProc = (LPSERVICE_MAI_FUCTIOA)ServiceMain;
//服务的最后一项要设置为ULL
stentry[1].lpServiceame = ULL;
stentry[1].lpServiceProc = ULL;
StartServiceCtrlDispatcher(stentry);
//system("pause");
return 0;
}
//服务主函数
void WIAPI ServiceMain(int argc, char** ar) {
MEMORYSTATUS memstatus;
char str[100];
int availMem;
//服务类型和状态
m_ServiceState.dwServiceType = SERVICE_WI2;
m_ServiceState.dwCurrentState = SERVICE_START_PEDIG;
m_ServiceState.dwControlsAccepted = SERVICE_COTROL_SHUTDOW | SERVICE_COTROL_STOP;
m_ServiceState.dwWin2ExitCode = 0;
m_ServiceState.dwServiceSpecificExitCode = 0;
//下面这两个基本不需要,除非服务启动时间很长
m_ServiceState.dwCheckPoint = 0;
m_ServiceState.dwWaitHint = 0;
//注册服务控制函数
m_ServiceHandle = RegisterServiceCtrlHandler("demo", (LPHADLER_FUCTIO)ServiceCtrlHandler);
if (m_ServiceHandle == ULL) {
WriteToLog("RegisterServiceCtrlHandler failed");
return;
}
WriteToLog("RegisterServiceCtrlHandler success");
//更新服务状态
m_ServiceState.dwCurrentState = SERVICE_RUIG;
SetServiceStatus(m_ServiceHandle, &m_ServiceState);
memset(str, '\0', 100);
bRunning = TRUE;
while (bRunning)
{
GlobalMemoryStatus(&memstatus);
availMem = memstatus.dwAvailVirtual / 1024 / 1024;
sprintf_s(str, 50 ,"available memory is %d MB, use %d %%", availMem, memstatus.dwMemoryLoad);
WriteToLog(str);
Sleep(SLEEP_TIME);
}
WriteToLog("service stop!");
}
//服务控制函数(启动,暂停等)
void WIAPI ServiceCtrlHandler(DWORD Opcode) {
switch (Opcode)
{
case SERVICE_COTROL_STOP:
bRunning = FALSE;
m_ServiceState.dwCurrentState = SERVICE_STOPPED;
break;
case SERVICE_COTROL_SHUTDOW:
bRunning = FALSE;
m_ServiceState.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus(m_ServiceHandle, &m_ServiceState);
}
int WriteToLog(char * str)
{
FILE* pFile;
fopen_s(&pFile, FILE_PATH, "a+");
fprintf_s(pFile, "%s\n", str);
fclose(pFile);
return 0;
}
编译并生成后可以用sc命令安装
代码语言:javascript代码运行次数:0运行复制sc create giantbranchDemo binpath= D:\
我们再打开服务即可看到
我们可以直接在上面的图形界面启动,也可以sc启动
启动停止与删除命令
代码语言:javascript代码运行次数:0运行复制sc start
sc stop
sc delete
如果程序本身自带启动和删除可以使用下面的:
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
#include <windows.h>
//毫秒
#define SLEEP_TIME 1000
#define FILE_PATH "C:\\"
#define SERVICEAME "practice"
//服务状态
SERVICE_STATUS m_ServiceState;
//服务状态句柄
SERVICE_STATUS_HADLE m_ServiceHandle;
void WIAPI ServiceMain(int argc, char** ar);
void WIAPI ServiceCtrlHandler(DWORD Opcode);
int WriteToLog(char* str);
BOOL InstallService();
void DelService();
BOOL bRunning;
int main(int argc, char** ar[]) {
SERVICE_TABLE_ETRY stentry[2];
if (argc == 2)
{
if (!strcmp(ar[1], "-i"))
{
InstallService();
}else if (!strcmp(ar[1], "-d"))
{
DelService();
}
return 0;
}
stentry[0].lpServiceame = SERVICEAME;
stentry[0].lpServiceProc = (LPSERVICE_MAI_FUCTIOA)ServiceMain;
//服务的最后一项要设置为ULL
stentry[1].lpServiceame = ULL;
stentry[1].lpServiceProc = ULL;
StartServiceCtrlDispatcher(stentry);
return 0;
}
//服务主函数
void WIAPI ServiceMain(int argc, char** ar) {
MEMORYSTATUS memstatus;
char str[100];
int availMem;
//服务类型和状态
m_ServiceState.dwServiceType = SERVICE_WI2;
m_ServiceState.dwCurrentState = SERVICE_START_PEDIG;
m_ServiceState.dwControlsAccepted = SERVICE_COTROL_SHUTDOW | SERVICE_COTROL_STOP;
m_ServiceState.dwWin2ExitCode = 0;
m_ServiceState.dwServiceSpecificExitCode = 0;
//下面这两个基本不需要,除非服务启动时间很长
m_ServiceState.dwCheckPoint = 0;
m_ServiceState.dwWaitHint = 0;
//注册服务控制函数
m_ServiceHandle = RegisterServiceCtrlHandler(SERVICEAME, (LPHADLER_FUCTIO)ServiceCtrlHandler);
if (m_ServiceHandle == ULL) {
WriteToLog("RegisterServiceCtrlHandler failed");
return;
}
WriteToLog("RegisterServiceCtrlHandler success");
//更新服务状态
m_ServiceState.dwCurrentState = SERVICE_RUIG;
SetServiceStatus(m_ServiceHandle, &m_ServiceState);
memset(str, '\0', 100);
bRunning = TRUE;
GlobalMemoryStatus(&memstatus);
availMem = memstatus.dwAvailVirtual / 1024 / 1024;
sprintf_s(str, 50, "available memory is %d MB, use %d %%", availMem, memstatus.dwMemoryLoad);
WriteToLog(str);
WriteToLog("service is Running!");
}
//服务控制函数(启动,暂停等)
void WIAPI ServiceCtrlHandler(DWORD Opcode) {
switch (Opcode)
{
case SERVICE_COTROL_STOP:
case SERVICE_COTROL_SHUTDOW:
bRunning = FALSE;
m_ServiceState.dwWin2ExitCode = 0;
m_ServiceState.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus(m_ServiceHandle, &m_ServiceState);
}
int WriteToLog(char * str)
{
FILE* pFile;
fopen_s(&pFile, FILE_PATH, "a+");
fprintf_s(pFile, "%s\n", str);
fclose(pFile);
return 0;
}
BOOL InstallService()
{
char strDir[1024];
SC_HADLE scHandler,schService;
LPCTSTR lpszBinaryPathame;
//GetCurrentDirectory(1024, strDir);
GetModuleFileame(ULL, strDir, 1024);
printf("%s\n", strDir);
lpszBinaryPathame = strDir;
scHandler = OpenSCManager(ULL, ULL, SC_MAAGER_ALL_ACCESS);
if (scHandler == ULL)
{
printf("open scmanager failed! May be you don't have the privilage?");
}
schService = CreateService(scHandler, SERVICEAME, SERVICEAME,
SERVICE_ALL_ACCESS,
SERVICE_WI2_OW_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_ORMAL,
lpszBinaryPathame,
ULL,
ULL,
ULL,
ULL,
ULL
);
if (schService == ULL)
{
printf("create service failed~");
return FALSE;
}
CloseServiceHandle(schService);
CloseServiceHandle(scHandler);
return TRUE;
}
void DelService()
{
SC_HADLE scHandler;
SC_HADLE schService;
SERVICE_STATUS status;
BOOL isSuccess;
DWORD errCode;
scHandler = OpenSCManager(ULL, ULL, SC_MAAGER_ALL_ACCESS);
if (scHandler == ULL)
{
printf("open scmanager failed! May be you don't have the privilage?");
return;
}
schService = OpenService(scHandler, SERVICEAME, SC_MAAGER_ALL_ACCESS | DELETE);
if (schService == ULL)
{
errCode = GetLastError();
printf("OpenService failed! code:%d\n", errCode);
return;
}
isSuccess = QueryServiceStatus(schService, &status);
if (!isSuccess)
{
printf("QueryServiceStatus failed!");
return;
}
if (status.dwCurrentState != SERVICE_STOPPED)
{
isSuccess = ControlService(schService, SERVICE_COTROL_STOP, &status);
if (!isSuccess)
{
printf("Stop Service failed!");
return;
}
}
isSuccess = DeleteService(schService);
if (!isSuccess)
{
printf("DeleteService failed");
return;
}
else {
printf("DeleteService success");
}
CloseServiceHandle(scHandler);
CloseServiceHandle(schService);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2018-01-20,如有侵权请联系 cloudcommunity@tencent 删除service编程服务函数windows #感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-24 14:23:12
推荐阅读
留言与评论(共有 8 条评论) |
本站网友 安置房有房产证吗 | 1秒前 发表 |
SC_MAAGER_ALL_ACCESS); if (scHandler == ULL) { printf("open scmanager failed! May be you don't have the privilage?"); return; } schService = OpenService(scHandler | |
本站网友 白茯苓 | 24分钟前 发表 |
bRunning = FALSE; m_ServiceState.dwWin2ExitCode = 0; m_ServiceState.dwCurrentState = SERVICE_STOPPED; break; default | |
本站网友 美然动力街区二手房 | 10分钟前 发表 |
SC_MAAGER_ALL_ACCESS | DELETE); if (schService == ULL) { errCode = GetLastError(); printf("OpenService failed! code:%d\n" | |
本站网友 中日钓鱼岛 | 23分钟前 发表 |
暂停等) void WIAPI ServiceCtrlHandler(DWORD Opcode) { switch (Opcode) { case SERVICE_COTROL_STOP | |
本站网友 胡萝卜汁的作用 | 1秒前 发表 |
ULL | |
本站网友 阳光丽景二手房 | 2分钟前 发表 |
暂停等) void WIAPI ServiceCtrlHandler(DWORD Opcode) { switch (Opcode) { case SERVICE_COTROL_STOP | |
本站网友 琅琊阁 | 6分钟前 发表 |
bRunning = FALSE; m_ServiceState.dwWin2ExitCode = 0; m_ServiceState.dwCurrentState = SERVICE_STOPPED; break; default |