C语言编写Windows服务程序
生活随笔
收集整理的這篇文章主要介紹了
C语言编写Windows服务程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C語言編寫Windows服務程序 原文:C語言編寫Windows服務程序
#include <Windows.h> #include <stdio.h>#define SLEEP_TIME 5000 // 間隔時間 #define LOGFILE "C:\\memstatus.txt" // 信息輸出文件SERVICE_STATUS ServiceStatus; // 服務狀態 SERVICE_STATUS_HANDLE hStatus; // 服務狀態句柄void ServiceMain(int argc, char** argv); void CtrlHandler(DWORD request); int InitService();int WriteToLog(char* str) {FILE* pfile;fopen_s(&pfile,LOGFILE,"a+");if (pfile==NULL){return -1;}fprintf_s(pfile,"%s\n",str);fclose(pfile);return 0; }// Service initialization int InitService() { OutputDebugString("Monitoring started.");int result;result = WriteToLog("Monitoring started.");return(result); } // Control Handler void CtrlHandler(DWORD request) {switch (request){case SERVICE_CONTROL_STOP:OutputDebugString("Monitoring stopped.");WriteToLog("Monitoring stopped.");ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus);return;case SERVICE_CONTROL_SHUTDOWN:OutputDebugString("Monitoring stopped.");WriteToLog("Monitoring stopped.");ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus (hStatus, &ServiceStatus);return;default:break;}// Report current statusSetServiceStatus (hStatus, &ServiceStatus);return; }void ServiceMain(int argc, char** argv) {int error;ServiceStatus.dwServiceType = SERVICE_WIN32;ServiceStatus.dwCurrentState = SERVICE_START_PENDING;ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;//在本例中只接受系統關機和停止服務兩種控制命令ServiceStatus.dwWin32ExitCode = 0;ServiceStatus.dwServiceSpecificExitCode = 0;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;hStatus = ::RegisterServiceCtrlHandler("MemoryStatus", (LPHANDLER_FUNCTION)CtrlHandler);if (hStatus == (SERVICE_STATUS_HANDLE)0){WriteToLog("RegisterServiceCtrlHandler failed");return;}WriteToLog("RegisterServiceCtrlHandler success");// Initialize Service error = InitService();if (error) {// Initialization failedServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus, &ServiceStatus); return; } // 向SCM 報告運行狀態ServiceStatus.dwCurrentState = SERVICE_RUNNING;SetServiceStatus (hStatus, &ServiceStatus);// 下面就開始任務循環了,你可以添加你自己希望服務做的工作MEMORYSTATUS memstatus;while (ServiceStatus.dwCurrentState == SERVICE_RUNNING){char buffer[16];GlobalMemoryStatus(&memstatus);int availmb = memstatus.dwAvailPhys/1024/1024;sprintf_s(buffer,100,"available memory is %dMB",availmb);OutputDebugString(buffer);int result = WriteToLog(buffer);if (result){ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = -1; SetServiceStatus(hStatus, &ServiceStatus);return;}Sleep(SLEEP_TIME);}WriteToLog("service stopped"); }void main() {SERVICE_TABLE_ENTRY ServiceTable[2];ServiceTable[0].lpServiceName="MemoryStatus";ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;ServiceTable[1].lpServiceName=NULL;ServiceTable[1].lpServiceProc=NULL;StartServiceCtrlDispatcher(ServiceTable);}
?
命令行操作:
?
?
注意我這里在sc create MemortyStatus binpath= D:\MemoryStatus.exe里面有個拼寫錯誤,MemoryStatus寫成了MemortyStatus,多了個t,這個沒關系,只要你在下面操作時候將錯就錯就行了。
運行結果:
?
最后,停止和刪除服務:
?
參考:
http://www.vckbase.com/index.php/wv/1193
http://www.2cto.com/kf/201111/111990.html
posted on 2014-12-16 08:10 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/lonelyxmas/p/4166269.html
總結
以上是生活随笔為你收集整理的C语言编写Windows服务程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs2012使用64位IIS EXPRE
- 下一篇: ystem.Windows.Forms.