0

クエリを 24 時間送信するために DELL サーバーで実行する必要がある GUI アプリケーションを作成しました。

アプリケーションがランダムなユーザーによって停止された場合、またはそれが何であれ、実行が停止したことを検出して再度実行するサービス プログラムを作成しました。

問題は、Microsoft が XP 以降の OS サービス ポリシーを変更したため、FindWindow() が正しく動作しない (常に nullptr を返す) ことです。また、私のサービス プログラムには、そのプログラムがプロセス リストにあるかどうかを確認する方法がありません。

「サービスがサービスパネルのデスクトップと対話できるようにする」という解決策をインターネットでいくつか見つけましたが、それはずっと前のことなので、現在のOSバージョンには完全には適合しません。

代わりに IPC を使用する必要がありますか? または他の修正方法はありますか?

CreateProcessAsUser() を使用してサービスからプロセスを実行することもできるため、これを行う方法が必要であると考えています。

アドバイスをいただければ幸いです。

前もって感謝します。

4

1 に答える 1

0

そこで、Remy Lebeau が提案したことを実行しました。Windows 7 と 2008 で適切に動作します。

これが私が一歩一歩進んだ方法です。

  1. GUI アプリケーションのグローバル名前空間に名前付きミューテックスを作成します。

    ::CreateMutex(nullptr, false, L"Global\\MyMutex");
    
  2. CreateMutex() を使用して定期的にミューテックスが消えていないかどうかを確認し、ハンドルへの参照カウントを忘れないようにしてください。

    HANDLE hDetector = ::CreateMutex(nullptr, false, L"Global\\MyMutex");
    
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
            // The GUI application is still running.
            // ...  
    
            ::CloseHandle(hDetector); 
    }
    else
    {
            // The GUI application is not running.
            // ...
    
            ::CloseHandle(hDetector);
    }
    
  3. それが機能するのを見てください。

于 2013-02-06T08:10:16.383 に答える