線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3386
推到 Plurk!
推到 Facebook!

自動安裝、自動執行的 Service (含 D7 和 D2007 的 Source Code )

 
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-08 18:10:00 IP:218.210.xxx.xxx 訂閱
最近在學 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 所做,如有錯誤的地方,煩請各位先進指教,謝謝
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-09-08 18:10:35, 註解 無‧
careychen 重新編輯於 2008-09-08 21:57:30, 註解 無‧
careychen 重新編輯於 2008-10-05 19:59:50, 註解 無‧
careychen 重新編輯於 2008-10-27 15:42:09, 註解 修正 jbmaster 大所發現的無法自動啟動問題‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-09 15:56:34 IP:61.220.xxx.xxx 訂閱
有 Source Code 就有興趣 ~ 感謝分享 ~

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-09 17:30:44 IP:218.210.xxx.xxx 訂閱
呵呵~~~,謝謝 pcboy 版主的指教,當初就是您下面的那句簽名,
讓我覺得在 ktop 這邊學這麼多,也是自己該出點力量了

能力不足, 求助於人; 有能力時, 幫幫別人
------
價值的展現,來自於你用哪一個角度來看待它!!
jbmaster
一般會員


發表:3
回覆:5
積分:1
註冊:2005-08-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-27 15:08:54 IP:222.66.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-27 15:54:37 IP:60.248.xxx.xxx 訂閱
感謝 jbmaster 大發現問題,剛看了一下 =_= 自己居然去動到 code 了,擔誤了大家,真是抱歉
已修正並上傳,再請大大賜教,謝謝
------
價值的展現,來自於你用哪一個角度來看待它!!
jbmaster
一般會員


發表:3
回覆:5
積分:1
註冊:2005-08-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-28 15:46:29 IP:222.66.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-28 16:51:06 IP:60.248.xxx.xxx 訂閱
哇,真是太棒了,非常感謝您的關注與支持,小弟覺得非常棒,
不過小弟最近公司事情真的很多,這個部份等小弟這一陣子忙完後,會把這個補上的,謝謝您的建議~!

或是 jbmaster 大,您可以獨自發表這個主題,畢竟小弟這個主題原本沒有涵蓋到這塊~~!
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-10-28 18:09:24, 註解 無‧
jbmaster
一般會員


發表:3
回覆:5
積分:1
註冊:2005-08-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-29 15:39:44 IP:222.66.xxx.xxx 未訂閱
To careychen

关于两用的exe我重新开了个帖子,欢迎共同研究~

对Service的一些研究~使普通exe项目和Serivce并用的方法.
------
要学的东西太多~
系統時間:2024-05-04 5:35:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!