Windows XP下Service的编程入门[1]
Windows XP下Service的編程入門[1]
// _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[])
{
?LPCTSTR lpServiceName = "Themes"; // 本例為關閉 Themes 服務
?SC_HANDLE scman = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
/* =============================================================================
SC_HANDLE OpenSCManager(LPCTSTR lpszMachineName,
??????????????????????? LPCTSTR lpszDatabaseName,
??????????????????????? DWORD fdwDesiredAccess);
== Open SCManager 函數打開指定計算機上的service control manager database。
== 其中參數lpszMachineName指定計算機名,若為空則指定為本機。
== 參數lpszDatabaseName指定要打開的service control manager database,默認為空。
== 參數fdwDesiredAccess指定操作的權限,可以為下面取值之一
SC_MANAGER_ALL_ACCESS??????? //所有權限
SC_MANAGER_CONNECT?????????? //允許連接service control manager
SC_MANAGER_CREATE_SERVICE??? //允許創建服務對象并把它加入service control manager database
SC_MANAGER_ENUMERATE_SERVICE //允許枚舉service control manager database中的服務
SC_MANAGER_LOCK????????????? //允許鎖住service control manager database
SC_MANAGER_QUERY_LOCK_STATUS //允許獲取servicecontrolmanagerdatabase的封鎖信息
== 函數返回值:函數執行成功則返回一個指向service control manager database的句柄,失敗則返回NULL。
============================================================================== */
?if (scman)
?{
??SC_HANDLE sh = ::OpenService(scman, lpServiceName, SERVICE_STOP);
/* ========================================================================
SC_HANDLE OpenService(SC_HANDLE schSCManager,
????????????????????? LPCTSTR lpszServiceName,
????????????????????? DWORD fdwDesiredAccess);
== OpenService函數打開指定的Service。
== 其中參數schSCManager是指向service control manager database的句柄,
由OpenSCManager函數返回。
== 參數lpszServiceName要打開的服務的名字,注意大小寫。
== 參數fdwDesiredAccess指定操作的權限,可以為下面取值之一
SERVICE_ALL_ACCESS??????????? //所有權限
SERVICE_CHANGE_CONFIG???????? //允許更改服務的配置
SERVICE_ENUMERATE_DEPENDENTS? //允許獲取依賴于該服務的其他服務
SERVICE_INTERROGATE??????????? //允許立即獲取服務狀態
SERVICE_PAUSE_CONTINUE??????? //允許暫停和喚醒服務
SERVICE_QUERY_CONFIG?????????? //允許獲取服務配置
SERVICE_QUERY_STATU??????????? //允許通過訪問service control manager獲取服務狀態
SERVICE_START????????????????? //允許啟動服務
SERVICE_STOP?????????????????? //允許停止服務
SERVICE_USER_DEFINE_CONTROL??? //允許用戶指定特殊的服務控制碼
== 函數返回值:函數執行成功則返回指向某項服務的句柄,失敗則返回NULL。
========================================================================== */
??if (sh)
??{
???BOOL ctrl;
???SERVICE_STATUS ServiceStatus;
???ctrl = ::ControlService(sh, SERVICE_CONTROL_STOP, &ServiceStatus);
/* ==========================================================================
BOOL ControlService(SC_HANDLE hService,
?????DWORD dwControl,
?????LPSERVICE_STATUS lpServiceStatus);
== ControlService函數向Win32service發送控制碼。
== 其中參數hService是指向某項服務的句柄,由OpenService函數返回。
== 參數dwControl為控制碼,常用的有
??? SERVICE_CONTROL_STOP???? //停止服務
??? SERVICE_CONTROL_PAUSE??? //暫停服務
??? SERVICE_CONTROL_CONTINUE??? //喚醒暫停的服務
??? SERVICE_CONTROL_INTERROGATE//刷新某服務的狀態
== 參數lpServiceStatus指向SERVICE_STATUS結構,用于存放該服務最新的狀態信息。
== 函數返回值:函數執行成功則返回True,失敗則返回False。
============================================================================= */
???DWORD dwControl;
???if (ctrl)
???{
????printf("success to stop the service /"%s/"/n",lpServiceName);
???}
???else
???{
????dwControl = ::GetLastError();
????switch(dwControl){
?????case ERROR_ACCESS_DENIED:
??????printf("The specified handle was not opened with the necessary access./n");
??????break;
?????case ERROR_SERVICE_NOT_ACTIVE:
??????printf("The service has not been started./n");
??????break;
?????case ERROR_DEPENDENT_SERVICES_RUNNING:
??????printf("The service cannot be stopped because other running services are dependent on it./n");
??????break;
?????case ERROR_INVALID_SERVICE_CONTROL:
??????printf("The requested control code is not valid, or it is unacceptable to the service./n");
??????break;
?????case ERROR_SERVICE_CANNOT_ACCEPT_CTRL:
??????printf("The requested control code cannot be sent to the service because the state of the service is SERVICE_STOPPED, SERVICE_START_PENDING, or SERVICE_STOP_PENDING./n");
??????break;
?????case ERROR_SERVICE_REQUEST_TIMEOUT:
??????printf("The service did not respond to the start request in a timely fashion./n");
??????break;
????}
???}
??}
??CloseServiceHandle(sh); // 關閉該Service
?}
?CloseServiceHandle(scman); // 關閉該Service
?printf("Hello World!/n");
?return 0;
}
總結
以上是生活随笔為你收集整理的Windows XP下Service的编程入门[1]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: usb转rj45_笔记本接口不够怎么办?
- 下一篇: io python_python学习笔记