Napisałem klasę do obsługi nazwanych połączeń rur, a jeśli utworzę instancję, zamknij ją, a następnie spróbuj utworzyć kolejną instancję, wywołanie CreateFile()
zwraca INVALID_HANDLE_VALUE
i GetLastError()
zwraca ERROR_PIPE_BUSY
. Co tu się dzieje? Co mogę zrobić, aby zapewnić, że połączenie z numerem Connect()
powiedzie się?Nazwany potok CreateFile() zwraca INVALID_HANDLE_VALUE, a GetLastError() zwraca ERROR_PIPE_BUSY
PipeAsync A, B;
A.Connect("\\\\.\\pipe\\test",5000);
A.Close();
cout << GetLastError(); // some random value
B.Connect("\\\\.\\pipe\\test",5000);
cout << GetLastError(); // 231 (ERROR_PIPE_BUSY)
B.Close();
Oto moje implementacje Connect()
i Close()
BOOL PipeAsync::Connect(LPCSTR pszPipeName, DWORD dwTimeout)
{
this->pszPipeName = pszPipeName;
this->fExisting = TRUE;
DWORD dwMode = this->fMessageMode ? PIPE_READMODE_MESSAGE : PIPE_READMODE_BYTE;
hPipe = CreateFile(
this->pszPipeName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if(INVALID_HANDLE_VALUE == hPipe)
return FALSE; /* set break point here ; breaks here on second call to Connect() */
if(GetLastError() == ERROR_PIPE_BUSY)
if(!WaitNamedPipe(this->pszPipeName, dwTimeout))
return FALSE; /* set break point here */
if(!SetNamedPipeHandleState(hPipe, &dwMode, NULL, NULL))
return FALSE; /* set break point here */
return TRUE;
}
VOID PipeAsync::Close()
{
if(fExisting)
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
}
EDIT: zapomniałem ci powiedzieć, jak wywnioskowałem to ... mogę ustawić złamać punktów wskazanych w komentarzach. Po uruchomieniu zatrzymuje się na pierwszym punkcie przerwania.
EDIT: To jest mój zaktualizowany kod
if(INVALID_HANDLE_VALUE == hPipe)
if(GetLastError() == ERROR_PIPE_BUSY)
{
if(!WaitNamedPipe(this->pszPipeName, dwTimeout))
return FALSE; /* break-point: breaks here on second call */
}
else
return FALSE; /* break-point /*
Teraz WaitNamedPipe()
zwraca false na drugim wywołaniu Connect()
i GetLastError()
powraca 2 lub ERROR_FILE_NOT_FOUND
?
Słowo porady: '\\', '\ p' i' \ t 'zostaną zinterpretowane jako znaki ucieczki. Przestaw przełącznik na ukośniki lub podwójny ukośnik odwrotny do "ucieczki przed ucieczkami": '" \\\\. \\ pipe \\ test "'. – Xeo
To był literówka ... Poprawiłem ... –