2011-10-12 123 views
1

我已經用C語言編寫了一個Windows服務,但缺乏用這種語言編寫服務的文檔意味着我需要一些幫助。Windows服務C

  1. 我想創建一個配置文件,服務讀取以獲得一些設置/選項。我想知道做這件事的最好方法是什麼以及如何做到這一點。服務.exe將與其他文件/程序一起安裝在用戶指定的位置。我有的第一個問題是我應該將此配置文件保存在與服務.exe相同的目錄中,還是應該將其放入爲我的程序創建的%appdata%文件夾中?

  2. 服務如何能夠找到配置文件。我應該將配置文件的位置存儲在註冊表中,並將註冊表項硬編碼到服務中?或者是否可以安裝該服務,以便它將配置文件路徑作爲默認命令行參數?還是應該將我的配置文件保存在與服務.exe相同的文件夾中並使用註冊表HKLM/System/CurrentControlSet/Services/<servicename>/ImagePath

  3. 我有以下代碼:

void main() { 
    SERVICE_TABLE_ENTRY ServiceTable[2]; 
    ServiceTable[0].lpServiceName = L"Service Name"; 
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; 
    ServiceTable[1].lpServiceName = NULL; 
    ServiceTable[1].lpServiceProc = NULL; 
    // Start the control dispatcher thread for our service 
    StartServiceCtrlDispatcher(ServiceTable); 
} 
void ServiceMain(int argc, char** argv) { 
    //stuff here 
} 

哪裏的ServiceMain從獲得其命令行參數,是它的「啓動參數:」根據特定服務的屬性框?是可以安裝它與一些默認參數?是否有可能以後編程添加一些?

  1. 當另一個服務啓動時是否可以使我的服務有條件地啓動?

  2. 我怎麼能安裝在生產這種服務?我一直在使用Windows SDK的sc進行開發,但這不適用於生產。唯一的方法是確保安裝微軟.net框架,然後運行installutil程序?我的服務輸出到一個日誌文件:我的服務,而無需使用.NET框架,所以我本來希望會有一個方式,而無需安裝.NET

加分題安裝服務寫入的。是否有可能檢查文件的大小,如果超過任意文件大小,是否可以刪除它?

PS我不知道爲什麼列表中的代碼後,重置爲1 & 2,它顯然在編輯框中說,4和5。

+0

提供的ServiceMain的參數是那些給StartService,如記錄HTTP:// msdn.microsoft.com/en-us/library/ms685138%28VS.85%29.aspx –

回答

2
  1. 由於服務是機器範圍的而不是每個用戶,因此將配置文件存儲在CSIDL_COMMON_APPDATA下。
  2. 呼叫SHGetFolderPath傳遞CSIDL_COMMON_APPDATA找出該文件夾。
  3. 命令行參數argv來自服務註冊時指定的命令行。這是您可以從服務控制管理器看到的。

我沒有提到第二組問題。你應該一次只問一個問題。儘管我對安裝服務有所瞭解。你當然不需要任何.net。準確地說,你應該怎麼做,這可能取決於你使用的安裝工具。

+0

感謝您的回覆。我看過SHGetFolderPath,但我不太清楚如何包含dll的。你能告訴我從哪裏下載它們,以及如何將它們包含在Visual Studio 2010項目中?我的安裝工具是NSIS,我應該使用它來製作appdata文件夾嗎?我見過一些C++服務代碼,它們在第一次運行時自行安裝。 – Michael

+0

太多的問題!不知道DLL在哪裏進入。是的,您使用安裝程序來編寫配置文件,假設安裝時提供的信息。運行時不安裝服務。他們不能運行,直到安裝。雞和雞蛋。 –

+0

大聲笑,抱歉的問題... SHGetFolderPath需要一個外部庫,我從哪裏得到shell32.lib/shell32.dll?我正在談論文件夾的創建。當您在不存在的目錄中打開文件時,Windows會自動創建文件夾嗎?哦,該服務有一個命令行參數安裝,然後將安裝它,而不是調用服務控制調度器。 .exe可以由安裝程序使用cmd行參數運行。 – Michael

2

許多服務使用以下注冊表子項來保存配置值:

HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \服務\\參數