3

コード プロジェクト記事を使用して Windows サービスを作成しました。-i および -d スイッチを使用して、サービスをインストールおよび削除できます。

services.msc でサービスを確認できますが、サービスを開始しても何もしません。以下に、サービスのメイン コードを示します。

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
  DWORD status;
  DWORD specificError;
  m_ServiceStatus.dwServiceType = SERVICE_WIN32;
  m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
  m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  m_ServiceStatus.dwWin32ExitCode = 0;
  m_ServiceStatus.dwServiceSpecificExitCode = 0;
  m_ServiceStatus.dwCheckPoint = 0;
  m_ServiceStatus.dwWaitHint = 0;

  m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service1", 
                                            ServiceCtrlHandler); 
  if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
  {
    return;
  }
  m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
  m_ServiceStatus.dwCheckPoint = 0;
  m_ServiceStatus.dwWaitHint = 0;
  if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
  {
  }

  bRunning=true;
  while(bRunning)
  {

    Sleep(150000);
    ShellExecute(NULL, "open", "C:\\", NULL, NULL, SW_SHOWNORMAL);

  }
  return;
}

しかし、サービスを開始している間、サービスはスリープ状態にも、エクスプローラーの起動にもなりません。何か不足していますか?

4

7 に答える 7

5

コンソールアプリケーションとして実行するオプションを含めるという提案と同様に、実行中のサービスにデバッガーをアタッチするという Ferruccio の提案は良いものです (ただし、それはあなたの場合には役に立ちません)。

スタートアップ コードをデバッグするには、スタートアップ コードの先頭でDebugBreak()を呼び出します。これにより、デバッガーが起動し、その時点でサービスの実行が一時停止します。デバッガーに入ったら、必要なブレークポイントを設定してから実行を続けます。

于 2012-04-13T12:07:02.787 に答える
0

ここにWindowsサービスのデバッグに関する一般的なヒントがいくつかありますが、一見したところ、ShellExecuteデスクトップとの対話が必要なのは使用しているという事実だと思います。サービスは通常、LocalServiceアカウントで実行されるため、物理デスクトップへの接続はありません。

于 2011-02-21T13:30:58.860 に答える
0

情報をテキスト ファイルに書き込む小さなロガー クラスを作成することをお勧めします。次に、たとえば次のようなものを入れることができます:

if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
    Logger.LogError("Service handler is 0.");
    return;
}    

while(running) {

   Logger.LogInfo("I am running.");

   //...
}
于 2011-02-21T12:15:11.690 に答える
0

サービスはヘッドレスであるため、GUI に関連するものを起動しようとしても、目に見える効果はありません。ShellExecute は、サービスの視覚的なコンテキストでアプリケーションを起動しますが、デスクトップでは見ることができません。

サービスが何かを実行していることを証明したい場合は、代わりにファイル システムに何かを書き込みます (または、サービス マネージャーが実行中でないことを通知する十分な機能を備えているため、サービスが実行されていることを信頼します)。

于 2011-02-21T12:02:27.557 に答える
-1

または、OutputDebugString() をサービス アプリに配置して、DbgView で出力を表示することもできます。サービス アプリケーションをデバッグするために実行しました。これが誰かに役立つことを願っています..

于 2013-10-24T05:37:51.993 に答える