He escrito una clase para manejar conexiones de canalización con nombre, y si creo una instancia, la cierro y luego intento crear otra instancia. Devuelve la llamada al CreateFile()
. INVALID_HANDLE_VALUE
y GetLastError()
devuelve ERROR_PIPE_BUSY
. ¿Que está pasando aqui? ¿Qué puedo hacer para asegurar que la llamada al Connect()
sea exitosa?Pipe con nombre CreateFile() devuelve INVALID_HANDLE_VALUE, y GetLastError() devuelve 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();
Éstos son mis implementaciones de Connect()
y 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: olvidé de decirle cómo llegué a la conclusión de este ... me puse romper puntos indicados en los comentarios Cuando se ejecuta, se detiene en el primer punto de ruptura.
EDIT: Este es mi código actualizado
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 /*
Ahora, WaitNamedPipe()
está volviendo falsa en la segunda llamada a Connect()
y GetLastError()
está regresando 2, o ERROR_FILE_NOT_FOUND
?
Un consejo: '\\', '\ p' y' \ t' se interpretarán como caracteres de escape. Cambie a barras diagonales inversas o barras diagonales inversas dobles para "escapar de los escapes": '" \\\\. \\ pipe \\ test "'. – Xeo
Eso fue un error ... Lo corrigí ... –