Ho scritto una classe per gestire le connessioni named pipe, e se creo un'istanza, la chiudo e quindi provo a creare un'altra istanza la chiamata a CreateFile()
restituisce INVALID_HANDLE_VALUE
e GetLastError()
restituisce ERROR_PIPE_BUSY
. Cosa sta succedendo qui? Cosa posso fare per assicurarsi che la chiamata a Connect()
abbia successo?Named Pipe CreateFile() restituisce INVALID_HANDLE_VALUE e GetLastError() restituisce 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();
Qui sono i miei implementazioni di Connect()
e 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: Ho dimenticato di dirvi come ho concluso questo ... ho impostato rompere punti indicati nei commenti. Quando è in esecuzione, si ferma sul primo punto di interruzione.
EDIT: Questo è il mio codice aggiornato
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 /*
Ora, WaitNamedPipe()
sta tornando falso in seconda convocazione per Connect()
e GetLastError()
sta tornando 2, o ERROR_FILE_NOT_FOUND
?
Un consiglio: '\\', '\ p' e' \ t' verranno interpretati come caratteri di escape. Passa alle barre di avanzamento o al doppio backslash per "sfuggire agli escape": '" \\\\. \\ pipe \\ test "'. – Xeo
Quello era un refuso ... L'ho corretto ... –