2008-12-26 76 views
6

我有一個基於Deplhi的Windows服務,在安裝時解析一些命令行參數。我希望將這些參數添加到服務命令行(註冊表中的ImagePath值),以便始終隨服務一起啓動服務。Delphi Windows服務命令行參數

我該如何做到這一點?

我想要的註冊表編輯器看起來就像這樣:
在註冊表項HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \服務\爲MyService

  • ImagePath = C:\Path\to\my\service.exe -some -arguments

感謝

更新:安裝完成與>MyService.exe /install -some -arguments。這些論點是我想堅持在命令行中的。

更新:我找到了一個直接寫入註冊表的解決方案(請參閱here),但我仍然想要一個更優雅的解決方案,比如使用一些TService屬性或類似的東西。謝謝!

+0

安裝過程如何完成? – 2008-12-26 19:26:31

回答

8

好吧,經過一番研究,我放棄了一個優雅的方法,並採取直接寫入註冊表的直接路徑。爲了使事情變得簡單,我這樣做了:我存儲了我希望在TService上傳遞變量的參數。然後,我將AfterInstall事件設置爲直接寫入註冊表(使用TRegistry對象)我想要的確切命令行。

uses Registry; 
procedure MyService.AfterInstall(Sender: TObject) ; 
var 
    reg:TRegistry; 
begin 
    reg := TRegistry.Create; 
    try 
    reg.RootKey := 'HKEY_LOCAL_MACHINE'; 
    if reg.OpenKey('SYSTEM\CurrentControlSet\Services\MyService', True) then 
    begin 
     reg.WriteExtendString ('ImagePath', ParamStr(0) + ' -some -arguments') ; 
     reg.CloseKey; 
    end; 
    finally 
    reg.Free; 
    end; 
end; 

不是我尋找的優雅的解決方案,但它的工作。

感謝您的其他答案!

0

我不認爲你可以使服務開始與他們,但如果你將這些參數存儲在註冊表中,你可以修改程序在將來開始總是去抓住他們。 (即,如果ParamCount = 0,則從註冊表中檢索參數)

+0

您肯定可以使用這些參數開始服務。問題是如何使安裝程序將它們添加到註冊表中。 – 2008-12-26 19:25:59

4

服務參數可以在lpBinaryPathName參數中傳遞給CreateService函數。在Delphi的TService中,這是在TServiceApplication.RegisterServices.InstallService中調用的,你不能輕易覆蓋它。

因此,我懷疑最簡單的方法是通過ChangeServiceConfig來處理TService.AfterInstall事件並更新註冊表。

0

Pablo, 我有同樣的問題,找不到任何東西,並去了編輯註冊表的路線。 此外,我還使用自定義操作來創建其他安裝目錄和複製文件(在C#中)。 您的建議很有幫助,我也停止了尋找「優雅」的方式。 謝謝

2

我剛剛發現了一些令人驚訝的東西,可以分享有價值的東西。

您可以(至少)以下方式指定Windows服務的參數:

  1. 在服務管理器GUI爲「Startparameter」輸入它。
  2. 把它作爲參數:SC.EXE YourService參數1參數2
  3. 在註冊表項中輸入它的ImagePath = .. \ YourService.exe參數1參數2

在Delphi中有2種方式查詢申請/服務參數:

  • System.ParamCount/System.ParamStr:這樣你可以得到3.的參數。
  • TService.ParamCount/TService.Param []:這樣你可以得到上面的1.和2.的參數。
+0

1.只有當您從服務管理器啓動服務時纔有效,它不會被保留。 – 2010-06-17 11:01:44

+0

是的。我已經實現瞭如上面接受的答案(AfterInstall)中所述的持續參數。這個答案只是作爲額外的信息。 – nang 2010-06-18 12:16:01

2

您應該使用SCM API來正確安裝服務並對其進行配置。 SC.EXE是SCM API的命令行界面。在這種情況下,你不應該直接操縱註冊表,它可以工作,但它也取決於服務帳戶擁有哪個權限。 無論如何,我想知道爲什麼你需要命令行參數,如果你將它們嵌入代碼 - 通常這些參數是設置在服務之外(通過安裝程序,配置器,不管)來改變服務行爲。