Visual Studio 2010でVisual Studio 2010プロジェクトに変換されたサービスプロジェクトがあります。これは、Visual C++ 2005で素晴らしい作品PreMessageLoopをオーバーライドする場合は、CAtlServiceModuleT :: PreMessageLoopを呼び出す必要があります
::Run関数は基底クラスPreMessageLoopを呼び出して、私のPreMessageLoopを呼び出します。そして、私はこのようになりますPreMessageLoop機能に問題があることを、気づきました複雑な初期化は、サービスがSERVICE_START_PENDINGになったときに発生します。私のPreMessageLoopが返ってくると、RunはSetServiceStatus(SERVICE_RUNNING)を呼び出します。
Visual C++ 2010は異なります。基本クラスのPreMessageLoopはSetServiceStatus(SERVICE_RUNNING)を呼び出します。複雑な初期化は、サービスがSERVICE_RUNNING状態にあるときに発生します。実際にはまだ初期化されているときに実行されているように見えます。
基本クラスのPreMessageLoop呼び出しをPreMessageLoop呼び出しの最後に移動できますか?それとも、単純な動きより複雑ですか?
フォロー
サービスがバックSERVICE_START_PENDING状態にSERVICE_RUNNING状態から行くことができると思われます。それは賢明ですか?すべての
複雑な初期化の中には、SQL Server CompactまたはSQL ServerまたはOracleを呼び出して内部オブジェクト全体を初期化するものがあります。 SQL Serverの呼び出しはCOMを経由します。それは "COM instanatiationの使用"ですか? –
内部COMオブジェクトのインスタンス化が必要な場合に、この単純な解決策があなたのためには機能しない場合でも、PreMessageLoop全体をオーバーライドして祖先からコピーし、祖先をもう呼び出さないでください。初期のSetServiceStatus呼び出しをコメントアウトし、初期化を完了したときにのみ実行中の状態を通知します。これにより、2005/2008 ATLと同じようになります。 –