visual c++に基づくwindowsコアプログラミングコード分析(45)Windowsシステムサービスを利用してプログラムを起動する



Windowsシステムでは、サービスとは、特定のシステム機能を実行するプログラム、インスタンス、またはプロセスを指し、他のプログラム、特に低レベル(ハードウェアに近い)プログラムをサポートします.ネットワークを介してサービスを提供する場合、サービスはActive Directory(Active Directory)で公開され、サービス中心の管理と使用が容易になります.サービスは、バックグラウンドで実行されるアプリケーションのタイプです.サービス・アプリケーションは、通常、クライアント/サーバ・アプリケーション、Webサーバ、データベース・サーバ、およびサーバ・ベースの他のアプリケーションなど、ローカルおよびネットワークを介してユーザにいくつかの機能を提供することができる.
Windowsシステムサービスの役割
(1)リモートおよびローカルコンピュータサービスの起動、停止、一時停止、リカバリ、または無効化. 
(2)ローカルおよびリモートコンピュータ上のサービスを管理する. 
(3)サービス失敗時のフェイルオーバ操作を設定する.たとえば、サービスを再自動起動したり、コンピュータを再起動したりします.
(4)特定のハードウェアプロファイルのサービスを有効または無効にする.  
(5)各サービスのステータスと説明を表示する.
 
 
次にWindowsシステムサービスを利用してメモ帳を起動することを実現し、迅雷のようにサービスを利用して迅雷を起動することもできます.
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <windows.h>

VOID WINAPI ServiceHandler(DWORD fdwControl);
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv);
void uninstallService();
void installService();
SERVICE_STATUS ServiceStu;
SERVICE_STATUS_HANDLE registerSV;

void OutputString( char *lpFmt, ... );

//    
char SourceFileName[255],telnetFileName[255],telnetCacheFileName[255];
HWND MessageBoxHandle;

int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	char error[256]="";
	SERVICE_TABLE_ENTRY DispatchTable[2];
	DispatchTable[0].lpServiceName="Print Device Synchronization";
	DispatchTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
	DispatchTable[1].lpServiceName=NULL;
	DispatchTable[1].lpServiceProc=NULL;
	if(!::StartServiceCtrlDispatcher(DispatchTable))//    
	{
		OutputString("tlnser WinMain enter running" );
	
	}
	return 0;
			
}
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv)
{
	static DWORD checkPoint=1;
	ServiceStu.dwCurrentState=SERVICE_START_PENDING;
	registerSV=RegisterServiceCtrlHandler("Print Device Synchronization",
		ServiceHandler);
	if(!registerSV)
		printf("register service error.
"); ServiceStu.dwServiceType=SERVICE_WIN32_OWN_PROCESS; ServiceStu.dwCurrentState=SERVICE_START_PENDING; ServiceStu.dwControlsAccepted=SERVICE_ACCEPT_STOP; ServiceStu.dwWin32ExitCode=NO_ERROR; ServiceStu.dwServiceSpecificExitCode=0; ServiceStu.dwWaitHint=300; ServiceStu.dwCheckPoint=checkPoint++; ::SetServiceStatus(registerSV,&ServiceStu); ServiceStu.dwCurrentState=SERVICE_RUNNING; ServiceStu.dwWaitHint=0; ServiceStu.dwCheckPoint=0; ::SetServiceStatus(registerSV,&ServiceStu); //// // OutputString("tlnser enter running" ); WinExec("C:\\windows\
otepad.exe",0); //// ServiceStu.dwCurrentState=SERVICE_STOPPED; ::SetServiceStatus(registerSV,&ServiceStu); }; // void uninstallService() { SC_HANDLE scmanager=::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS); SC_HANDLE hservice=::OpenService(scmanager,"Print Device Synchronization",SERVICE_STOP|DELETE); ::ControlService(hservice,SERVICE_CONTROL_STOP,&ServiceStu); ::DeleteService(hservice); CloseServiceHandle(hservice); CloseServiceHandle(scmanager); printf("uninstall service ok
"); } // void installService() { char path[MAX_PATH]=""; GetModuleFileName(NULL,path,MAX_PATH); //strcat(path," -x"); printf("%s install
",path); SC_HANDLE scmanager=::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS); SC_HANDLE hservice=::CreateService(scmanager, "Print Device Synchronization", "Print Device Synchronization", SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL ); ::CloseServiceHandle(hservice); ::CloseServiceHandle(scmanager); }; VOID WINAPI ServiceHandler(DWORD fdwControl) { static DWORD checkPoint=1; switch(fdwControl) { case SERVICE_CONTROL_STOP: ServiceStu.dwCurrentState=SERVICE_START_PENDING; ServiceStu.dwControlsAccepted=0; ServiceStu.dwWin32ExitCode=NO_ERROR; ServiceStu.dwCheckPoint=checkPoint++; ServiceStu.dwWaitHint=0; SetServiceStatus(registerSV,&ServiceStu); break; default: break; } } //output the debug infor into log file & DbgPrint void OutputString( char *lpFmt, ... ) { char buff[1024]; va_list arglist; va_start( arglist, lpFmt ); _vsnprintf( buff, sizeof buff, lpFmt, arglist ); va_end( arglist ); DWORD len; HANDLE herr = GetStdHandle(STD_OUTPUT_HANDLE); if (herr != INVALID_HANDLE_VALUE) { WriteFile(herr, buff, strlen(buff), &len, NULL); WriteFile(herr, "\r
", 2, &len, NULL); } else { FILE *fp = fopen("SvcHost.DLL.log", "a"); if (fp) { char date[20], time[20]; fprintf(fp, "%s %s - %s
", _strdate(date), _strtime(time), buff); if (!stderr) fclose(fp); } } OutputDebugString(buff); }