我已經編寫了一個窗口服務,它捕獲UDP消息,以用戶身份創建進程,通過命名管道將消息發送到進程並重復。服務在XP中效果很好,但在一次迭代之後在Windows 7中意外終止。事件查看器顯示,在將消息傳遞給該服務後,出現應用程序錯誤,然後意外終止了我的服務。應用程序錯誤說錯誤模塊是ntdll.dll。調試我的服務將顯示代碼停止的位置。Windows服務在Windows 7中意外終止
這是我的工作循環。在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」)之後它會失敗。我已經編輯過我的帖子。 –