Windows XP下Service的编程入门[2]
Windows XP下Service的編程入門[2]
// _dse.cpp : Defines the entry point for the console application.
// 作者: 秋鎮菜
// E-mail: cyin8@msn.com
// 本程序很簡單
#include "stdafx.h"
#include "windows.h"
int main(int argc, char* argv[])
{
??? SC_HANDLE hSCManager = NULL;
??? int nRet = 0;
??? //
??? // 打開服務控制管理器
??? //
??? hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
??? if(hSCManager == NULL)
??? {
??????? printf("OpenSCManager() failed. --err: %d/n", GetLastError());
??????? return -1;
??? }
??? //
??? // 調用EnumServices列舉系統中的服務
??? //
??? DWORD dwServicesReturned = 0;
??? DWORD cbBytesNeeded = 0;
??? DWORD cbBufSize = 0;
??? //
??? // 首次調用EnumServicesStatus確定緩沖區的大小,由cbBytesNeeded返回
??? //
??? nRet = EnumServicesStatus(
??????? hSCManager,
??????? SERVICE_DRIVER,
??????? SERVICE_STATE_ALL,
??????? NULL,
??????? 0,
??????? &cbBytesNeeded,
??????? &dwServicesReturned,
??????? 0);
/* ==============================================================================================
BOOL EnumServicesStatus(
?SC_HANDLE hSCManager,
?DWORD dwServiceType,
?DWORD dwServiceState,
?LPENUM_SERVICE_STATUS lpServices,
?DWORD cbBufSize,
?LPDWORD pcbBytesNeeded,
?LPDWORD lpServicesReturned,
?LPDWORD lpResumeHandle);
?EnumServicesStatus函數用于枚舉NT下存在的Service。
?其中參數hSCManager是指向service control manager database的句柄,由OpenSCManager函數返回,且必須有SC_MANAGER_ENUMERATE_SERVICE的權限。
?參數dwServiceType指定按服務的類型枚舉。
?參數dwServiceState指定按服務的狀態枚舉。
?參數lpServices指向ENUM_SERVICE_STATUS結構,用于存放返回的服務的名字和狀態信息。
?參數cbBufSize返回參數lpServices的長度,以字節為單位。
?參數pcbBytesNeeded返回獲取剩余的Service所需字節的個數。
?參數lpServicesReturned返回服務的個數。
?參數lpResumeHandle,當第一次調用時該參數為0,當該函數再次被調用以獲取另外的信息時,該參數表示下一個被讀的Service。
?函數返回值:函數執行成功則返回True,失敗則返回False。
?值得注意的是通常情況下該函數返回的結果為FALSE,我們可以調用GetLastError()來獲取進一步信息。因為一臺機器上有多種服務存在,所以GetLastError()應為ERROR_MORE_DATA,此時應再次調用EnumServicesStatus函數以獲取正確的Service列表。
============================================================================================== */
??? ENUM_SERVICE_STATUS *lpServices = new ENUM_SERVICE_STATUS[cbBytesNeeded];
??? cbBufSize = cbBytesNeeded;
??? nRet = EnumServicesStatus(
??????? hSCManager,
??????? SERVICE_DRIVER,
??????? SERVICE_STATE_ALL,
??????? lpServices,
??????? cbBufSize,
??????? &cbBytesNeeded,
??????? &dwServicesReturned,
??????? 0);
??? if(nRet == 0)
??? {
??????? printf("EnumServicesStatus() failed.");
??????? return NULL;
??? }
??? if(lpServices == 0)
??? {
??????? CloseServiceHandle(hSCManager);
??????? return -1;
??? }
?for(DWORD i = 0; i < dwServicesReturned; i++, lpServices++)
?{
??????????? printf("%s/r/n->[%s]/n", lpServices->lpServiceName,
??????????????? lpServices->lpDisplayName);
?}
??????? printf("/r/nTotal %d Service(s)./n/n", dwServicesReturned);
?CloseServiceHandle(hSCManager);
??????? return 0;
}
// 請參考:
// Windows XP下Service的編程入門[1]->http://blog.csdn.net/i_like_cpp/archive/2005/06/03/387296.aspx
總結
以上是生活随笔為你收集整理的Windows XP下Service的编程入门[2]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity三维向量变化为角度_UNITY
- 下一篇: java信息管理系统总结_java实现科