自動安裝、自動執行的 Service (含 D7 和 D2007 的 Source Code ) |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
最近在學 Service ,但在搜尋的文章裡很少看到比較完整的內容,因此小弟整理了一下
參考文章如下: 如何在 TService 的 AfterInstall 裡面立刻啟動 Service? 由 RootKit 大回的這一段 要如何寫程式碼才能判斷某服務(service)是否已啟動或未安裝? 沒有我要的那一段,所以自己上 MSDN 找 Service中Edit不可以輸入? 似乎由 Service 所開主 Form 不行輸入,但由 主 Form Create 出來的就可以 如何做 service 的描述 使用 qoo1234 版主的方法 附上幾段程式碼,可以讓想學 Service 的同好們知道重點 1、在 ServiceCheck.pas 裡 有個 CheckServiceRun 的 function ,可以從裡面得知 a、是否已安裝服務 b、服務的啟動狀態 ( 使用 QueryServiceStatus 得知 ) c、如果服務是正在執行的狀態,則 Send 一個自定的 Message 請 Main Form 出現 2、Sample 除了會自動偵測是否有安裝外,也可以使用原本的方式下參數的方式來安裝/ 解除安裝 例: a、執行 AutoService ==> 自動檢查上述第一點的狀態 b、執行 AutoService /install ==> 安裝後顯示視窗 c、執行 AutoService /install /silent ==> 安裝後無回覆視窗 d、執行 AutoService /Uninstall ==> 解除安裝 Service 3、有開啟 Service 中 InterActive 的屬性,有一個 MainForm 平時會縮在 TrayIcon 裡,可以點選開啟, 或是當又執行一次 1.c 的動作時,會自動呼叫開啟 本程式小弟是初學 Service 所做,如有錯誤的地方,煩請各位先進指教,謝謝
------
價值的展現,來自於你用哪一個角度來看待它!! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
jbmaster
一般會員 發表:3 回覆:5 積分:1 註冊:2005-08-23 發送簡訊給我 |
To careychen:
首先感谢careychen提供的代码,来方便我们大众. 在阅读了你的代码后,我发现有个前后矛盾的地方,所以想提出来探讨,以下是一些代码片段: //检查是否有传入的参数 begin Application.Initialize; //检查是否有传入?参数 if ParamCount = 0 then begin // 没有任何参数,检查是否已安装或是否执行中 if CheckServiceRun then Application.CreateForm(TServiceMain, ServiceMain); Application.Run; end else Application.Run; end. 从代码得知,在没有参数的情况下并且Server没有安装或开启的情况会执行Application.CreateForm(TServiceMain, ServiceMain);继续看下去 下面的代码是来自CheckServiceRun中 ... if hService = 0 then begin // 找不到服务,对自己下达安装指令 ShellExecute(Application.Handle, 'Open', PChar(Forms.Application.ExeName), ' /install /silent', PChar(ExtractFileDir(Forms.Application.ExeName)), SW_NORMAL); end ... 没有服务就自动安装.从代码看出,自动执行XXX.exe /install /silent的命令以达到安装服务的目的,但是从之前的代码来看程序的重点是在没有参数的情况下运作的,也就是或如果在一台新系统下这个程序永远也安装不了服务.因为程序本身上有逻辑矛盾. 不知我的理解是否正确,欢迎大家讨论.
------
要学的东西太多~ |
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
jbmaster
一般會員 發表:3 回覆:5 積分:1 註冊:2005-08-23 發送簡訊給我 |
To:careychen
能否让一个exe既可以当做普通的程式来执行又可以当做一个service来使用??? 当做普通exe的时候有窗体存在(当然也可以没有窗体),并运作所有功能,如果作为service的话亦如此. 下面是我的一个代码构想: [code delphi] program ServiceOne; uses SvcMgr, Messages, Windows, ScktComp, RdServiceMainUnit in 'RdServiceMainUnit.pas' {ServiceOne: TService}; {$R *.RES} var WNDCLASS: tagWNDCLASS; szAppName: PChar = 'ServiceOne'; hWnd: Integer; Msg: tagMSG; ServerSocket: TServerSocket; function WndProc(hWnd: Integer; Msg: Cardinal; wParam: Cardinal; lParam: Integer): Integer; cdecl; var DC: HDC; Rect: TRECT; PS: PAINTSTRUCT; begin case Msg of WM_CREATE: begin end; {WM_PAINT: begin DC := BeginPaint(hWnd, PS); GetClientRect(hWnd, Rect); DrawText(DC, 'Hello, Windows98!', -1, RECT, DT_SINGLELINE or DT_CENTER or DT_VCENTER); EndPaint(hWnd, PS); end;} WM_DESTROY: PostQuitMessage(0); end; Result := DefWindowProc(hWnd, msg, wParam, lParam); end; begin if ParamCount <> 0 then begin Application.Initialize; Application.CreateForm(TSVSS, SVSS); Application.Run; end else begin WNDCLASS.style := CS_HREDRAW or CS_VREDRAW; WNDCLASS.lpfnWndProc := @WndProc; WNDCLASS.cbClsExtra := 0; WNDCLASS.cbWndExtra := 0; WNDCLASS.hInstance := hInstance; WNDCLASS.hIcon := LoadIcon(0, IDI_APPLICATION); WNDCLASS.hCursor := LoadCursor(0, IDC_ARROW); WNDCLASS.hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH)); WNDCLASS.lpszMenuName := nil; WNDCLASS.lpszClassName := szAppName; if not Boolean(RegisterClass(WNDCLASS)) then begin MessageBox(0, '系统不支持!', szAppName, MB_ICONERROR); Halt; end; hWnd := CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, 200, 200, 200, 200, 0, 0, hInstance, nil); ShowWindow(hWnd, SW_NORMAL); UpdateWindow(hWnd); while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end; [/code] 通过执行参数来区分.
------
要学的东西太多~
編輯記錄
jbmaster 重新編輯於 2008-10-28 15:48:16, 註解 無‧
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
|
jbmaster
一般會員 發表:3 回覆:5 積分:1 註冊:2005-08-23 發送簡訊給我 |
------
要学的东西太多~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |