2008-09-03 10 views
7

Visual Studioを使用してWindowsサービスを作成するのは簡単です。私の質問は、サービスとして実際に実行可能なものを実際にインストールできるものについて少し深く入ります。&ストレートCアプリケーションとしてサービスを書く方法。私はこれについて多くの参考文献を見つけることができませんでしたが、私は自分の.exeをサービスとしてインストールできるように実装できるインターフェースがなければならないと推測しています。このことができますVisual StudioなしでWindowsサービスを作成する

答えて

1

ホープ:

http://support.microsoft.com/kb/251192

あなたの簡単な必要性は、サービスとして登録するためにバイナリ実行ファイルに対して、このexeファイルを実行することと思われます。

2

基本的に実装するいくつかのインターフェイスと同様に設定する必要があるレジストリ設定がいくつかあります。

これをチェックアウト:http://msdn.microsoft.com/en-us/library/ms685141.aspx

あなたは、SCM(サービスコントロールマネージャ)に興味を持っています。

3

実行可能ファイルをサービスとして設定することは、その一部ですが、実際には、使用しているインストールソフトウェアによって実際に処理されます。テスト中にコマンドラインSCツールを使用できます(またはインストーラが不要な場合)。

重要なことは、起動時にStartServiceCtrlDispatcher()を呼び出す必要があることです。これによりサービスがサービスコントロールマネージャに接続され、サービスのメインエントリポイントであるServiceMainルーチンが設定されます。

ServiceMain(実際に好きなものを呼び出すことはできますが、常にServiceMainと思われます)、RegisterServiceCtrlHandlerEx()をコールして特定のイベントが発生したときにOSがサービスに通知できるようにコールバックルーチンを定義する必要があります。サービスとして設定

:ここ

は、私が数年前に書いたサービスから、いくつか抜粋している

SERVICE_TABLE_ENTRY ServiceStartTable[] = 
{ 
    { "ServiceName", ServiceMain }, 
    { 0, 0 } 
}; 

if (!StartServiceCtrlDispatcher(ServiceStartTable)) 
{ 
    DWORD err = GetLastError(); 
    if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) 
     return false; 
} 

ServiceMain:

void WINAPI ServiceMain(DWORD, LPTSTR*) 
{ 
    hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0); 

サービスハンドラ:

DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*) 
{ 
    switch (ControlCode) 
    { 
    case SERVICE_CONTROL_INTERROGATE : 
     // update OS about our status 
    case SERVICE_CONTROL_STOP : 
     // shut down service 
    } 

    return 0; 
} 
1

私はパーティーに少し遅れていることを知っていますが、私は最近この同じ質問をしていて、答えを探しているウェブサイトを通して苦労しなければなりませんでした。

私はMSDNでこの記事を見つけることができましたが、それは実際に基礎を築いています。私は必要なすべてのコマンドを含む単一のexeファイルに多くのファイルを結合してしまい、私自身のニーズに合わせてサービスの完全なライフサイクルをループする独自の "void run()"メソッドを追加しました。そこに将来サーチャーのために、それをチェックアウトして

これは、まさにこの質問を持つ他の誰かに素晴らしいスタートになります:

完全なサービスサンプル http://msdn.microsoft.com/en-us/library/bb540476(VS.85).aspx