LPSERVICE_MAIN_FUNCTIONA回呼函式 (winsvc.h)

服務的進入點。

LPSERVICE_MAIN_FUNCTION類型會定義這個回呼函式的指標。 ServiceMain 是應用程式定義函數名稱的佔位元。

語法

LPSERVICE_MAIN_FUNCTIONA LpserviceMainFunctiona;

void LpserviceMainFunctiona(
  [in] DWORD dwNumServicesArgs,
  [in] LPSTR *lpServiceArgVectors
)
{...}

參數

[in] dwNumServicesArgs

lpServiceArgVectors 陣列中的自變數數目。

[in] lpServiceArgVectors

呼叫啟動服務的 StartService 函式,以 Null 終止的自變數字串傳遞至服務。 如果沒有自變數,這個參數可以是NULL。 否則,第一個自變數 (lpServiceArgVectors[0]) 是服務的名稱,後面接著任何其他自變數 (lpServiceArgVectors[1] 到 lpServiceArgVectors[dwNumServicesArgs-1]) 。

如果使用者從 控制台 使用 Services 嵌入式管理單元啟動手動服務,lpServiceArgVectors 參數的字串來自服務 (的服務屬性對話框,以滑鼠右鍵按兩下服務專案,按兩下 [屬性],然後在 [開始參數] 中輸入參數。)

傳回值

備註

服務程式可以啟動一或多個服務。 服務進程針對可啟動的每個服務,都有 一個SERVICE_TABLE_ENTRY 結構。 結構會指定該服務的服務名稱和 ServiceMain 函式的指標。

當服務控制管理員收到啟動服務的要求時,如果服務尚未執行) ,它會啟動服務進程 (。 服務進程的主要線程會呼叫 StartServiceCtrlDispatcher 函式,其中包含 SERVICE_TABLE_ENTRY 結構的數位指標。 然後,服務控制管理員會將啟動要求傳送給此服務進程的服務控制發送器。 服務控制發送器會建立新的線程,以執行正在啟動之服務的 ServiceMain 函式。

ServiceMain 函式應該立即呼叫 RegisterServiceCtrlHandlerEx 函式,以指定 HandlerEx 函式來處理控制要求。 接下來,它應該呼叫 SetServiceStatus 函式,以將狀態資訊傳送給服務控制管理員。 在這些呼叫之後,函式應該會完成服務的初始化。 請勿嘗試在 ServiceMain 函式中啟動另一個服務。

服務控制管理員 (SCM) 等到服務回報SERVICE_RUNNING的狀態為止。 建議服務儘快報告此狀態,因為系統中需要與 SCM 互動的其他元件會在這段期間遭到封鎖。 某些函式可能需要直接或間接與 SCM 互動。

SCM 會在初始化期間鎖定服務控制資料庫,因此如果服務嘗試在初始化期間呼叫 StartService ,則呼叫將會封鎖。 當服務回報成功啟動的 SCM 時,它可以呼叫 StartService。 如果服務需要另一個服務正在執行,服務應該設定必要的相依性。

此外,您不應該在服務初始化期間呼叫任何系統函式。 只有在服務程式代碼報告SERVICE_RUNNING狀態之後,服務程式代碼才應該呼叫系統函式。

ServiceMain 函式應該建立全域事件、在此事件上呼叫 RegisterWaitForSingleObject 函式,然後結束。 這會終止執行 ServiceMain 函式的線程,但不會終止服務。 當服務停止時,服務控制處理程式應該使用 SERVICE_STOP_PENDING 呼叫 SetServiceStatus ,併發出此事件的訊號。 來自線程集區的線程會執行等候回呼函式;此函式應該執行清除工作,包括關閉全域事件,並使用 SERVICE_STOPPED呼叫 SetServiceStatus 。 服務停止之後,您不應該執行任何其他服務程式代碼,因為如果服務收到啟動控件,而且 再次呼叫 ServiceMain ,就可能會產生競爭條件。 請注意,當多個服務共用進程時,較可能發生這個問題。

範例

如需範例,請參閱 撰寫 ServiceMain 函式

注意

winsvc.h 標頭會將LPSERVICE_MAIN_FUNCTION定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平台 Windows
標頭 winsvc.h (包括 Windows.h)

另請參閱

HandlerEx

RegisterServiceCtrlHandlerEx

RegisterWaitForSingleObject

SERVICE_TABLE_ENTRY

服務函式

ServiceMain 函式

SetServiceStatus

StartServiceCtrlDispatcher