2012-06-11 62 views
0

我想將一個win32應用程序轉換爲服務。我使用CreateService()來創建應用程序作爲服務(使用下面的代碼)。啓動服務與參數

SC_HANDLE schService = CreateService 
    ( 
     schSCManager, /* SCManager database  */ 
     pName,   /* name of service   */ 
     pName,   /* service name to display */ 
     SERVICE_ALL_ACCESS,  /* desired access   */ 
     SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS , /*service type*/ 
     SERVICE_AUTO_START,  /* start type    */ 
     SERVICE_ERROR_NORMAL,  /* error control type  */ 
     pPath,   /* service's binary  */ 
     NULL,      /* no load ordering group */ 
     NULL,      /* no tag identifier  */ 
     NULL,      /* no dependencies   */ 
     NULL,      /* LocalSystem account  */ 
     NULL 
    );      /* no password    */ 

我能夠啓動該服務,如果在實際應用中沒有參數。如果我嘗試以參數開始服務,那麼它的創建問題。

LPCTSTR apszSvcArgv[32] = {"start","passwd"}; 
int nSvcArgc = 2; 
if(StartService(schService, nSvcArgc,apszSvcArgv)) 
{ 
    return TRUE; 
} 

我企圖把傳入的參數在主程序和它始終顯示的任何參數爲1

難道我做錯了什麼?是否有可能將這樣的參數傳遞給win32控制檯應用程序。

請糾正我,如果我錯了..提前

+0

你不能只運行一個控制檯應用程序作爲服務通過調用魔'CreateService'函數的一個例子。 Windows服務是特殊類型的應用程序,特別設計爲服務。 –

+0

感謝您的重播。但是我有一些疑問,如果沒有參數,我可以使用相同的方法創建和啓動服務。創建後,服務名稱將在services.msc中列出,啓動後,它將在任務管理器中正常顯示。埃文我能夠訪問該服務。我從http://www.codeproject.com/Articles/16488/A-Windows-Service-Application – DAC84

+2

得到了這個想法。僅僅因爲你*能*做某事並不意味着這是一個好主意或正在工作。 CreateService函數實際上並不能驗證你的可執行文件是否被設計爲一個服務,它只是假設你知道你在做什麼。我不知道你爲什麼懷疑我剛剛說過的話,很明顯你會遇到問題,使得這項工作像你期望的那樣。原因是因爲服務與典型應用程序有很大不同。是的,互聯網上有錯誤的信息。鏈接文章的第一段顯示了對服務的嚴重誤解。 –

回答

2

感謝您需要定義ARGS向量爲const char(或WCHAR),然後傳遞載體StartService。

這裏是一個Unicode程序VS

const wchar_t *args[] = { L"arg1", L"arg2", L"arg3", L"arg4" }; 
StartService(schService, 4, args);