0

私は ATL サービスを作成しました。テスト中は、永久に実行される while ループを残して、単純に実行し続けました (以下のコードを参照)。

HRESULT Run(_In_ int nShowCmd = SW_HIDE)
{
    m_running = true;
    HANDLE thread = (HANDLE)_beginthreadex(NULL, 0, &MyFunctionToRunInTheService, 0, 0, 0);
    while(m_running);
    return CAtlServiceModuleT::Run(nShowCmd);
}

実際のサービスとして実際に実行する準備ができましたが、これを行う方法がわかりませんか? 私は次のすべてを見てきましたが、ATL サービスの例を 1 つ見つけることができないようです。

スレッドコードを削除してメソッドを直接呼び出すと、サービスは常に開始状態になります。ループを削除すると、サービスが開始され、すぐに停止します。何か提案はありますか?

4

2 に答える 2

1

コードを次のように変更して問題を修正しました

HRESULT Run(_In_ int nShowCmd = SW_HIDE)
{
    _beginthreadex(NULL, 0, &CheckForExpiredFiles, 0, 0, 0);
    return CAtlServiceModuleT::Run(nShowCmd);
}

while ループはまったく必要ありませんでした。さらに調査すると、サービスを維持するためのコードが標準として付属しています。問題は、atlbase.h の PreMessageLoop メソッドが S_FALSE を返し、サービスが停止することでした。私の場合、S_FALSE が返された理由は、COM オブジェクトを追加していなかったためです。したがって、この場合は S_OK を返すように PreMessageLoop メソッドをオーバーライドしました。

于 2013-05-03T11:55:56.117 に答える
0

私の場合、_ATL_NO_COM_SUPPORT マクロを C\C++ プリプロセッサに追加して問題を解決します。

詳細はこちら...

于 2019-07-08T03:18:40.260 に答える