日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows XP下Service的编程入门[2]

發布時間:2025/3/15 windows 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。