UDPメッセージをキャッチし、ユーザーとしてプロセスを作成し、名前付きパイプ経由でプロセスにメッセージを送信し、繰り返しを実行するWindowsサービスを作成しました。サービスはXPではうまくいますが、1回の反復後にWindows 7で予期せず終了します。イベントビューアには、メッセージをサービスに渡すとアプリケーションエラーが発生し、サービスが予期せず終了したことが示されます。アプリケーションエラーは、障害モジュールがntdll.dllであることを示します。私のサービスをデバッグすると、コードがどこで停止するかが示されます。Windows 7でWindowsサービスが予期せず終了する
ここに私のワークループがあります。 XPで
do
{
DebugLog("Waiting For UDP message");
if(recvfrom(socketId, buffer, buffSize, 0, &clientAddrCast, &size) >= 0)
{
DebugLog("Create Named Pipe");
hPipe = CreateNamedPipe(lpszPipename, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message pipe
PIPE_READMODE_MESSAGE, // message read mode
1, // maximum Instaces
buffSize, // output buffer size
buffSize, // input buffer size
5000, // client time-out
&pSecAttrib); // security attributes
if (hPipe == INVALID_HANDLE_VALUE)
ErrorLog("CreateNamedPipe");
DebugLog("Create User Process");
if(!CreateProcessAsUser(hTokenDupe, "C:\\Services\\UDPClient_UserApp.exe", NULL, NULL, NULL, false, dwCreationFlags, NULL, NULL, &si, &pi))
{
// if client app fails use SendMessage as failsafe
//WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, sessionID, pTitle, sizeof(pTitle),
//buffer, sizeof(buffer), MB_OK, 30, &resp, false);
ErrorLog("CreateProcess");
}
else
{
DebugLog("Writing to User Process");
// Open pipe to client
if(cSuccess = ConnectNamedPipe(hPipe, NULL) == 0)
ErrorLog("ConnectNamedPipe");
else
{
Sleep(2000);
cbToWrite = (lstrlen(buffer)+1)*sizeof(TCHAR);
if(!WriteFile(
hPipe, // pipe handle
buffer, // message
cbToWrite, // message length
&cbWritten, // bytes written
NULL)) // not overlapped
ErrorLog("WriteFile");
}
}
}
DebugLog("Cleanup");
DestroyEnvironmentBlock(&pEnv);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
ErrorLog("test");
}while(gServiceStatus.dwCurrentState == SERVICE_RUNNING);
私のデバッグログはDebugLog("Cleanup")
後、それはDebugLog("Waiting For UDP message")
にループバックすることを示しています。 Windows 7では、それはDebugLog("Cleanup")
の後に停止します。コードが作成する可能性がある問題を探しています。他の提案は非常に高く評価されます。
おかげで、 ジョセフG.
申し訳ありません。 'DebugLog(" Cleanup ")'が呼ばれた後、どこかで失敗します。私はすでに私の投稿を編集しています。 –