मैंने नामित पाइप कनेक्शन को संभालने के लिए एक कक्षा लिखी है, और यदि मैं कोई उदाहरण बनाता हूं, इसे बंद करता हूं, और फिर एक और उदाहरण बनाने का प्रयास करें तो CreateFile()
रिटर्न पर कॉल करें INVALID_HANDLE_VALUE
, और GetLastError()
ERROR_PIPE_BUSY
देता है। यहाँ क्या चल रहा है? Connect()
पर कॉल को बीमा करने के लिए मैं क्या कर सकता हूं?नामांकित पाइप CreateFile() INVALID_HANDLE_VALUE लौटाता है, और GetLastError() देता है 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();
यहाँ Connect()
की मेरी कार्यान्वयन और 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);
}
हैं
संपादित करें: मैं आपको बताना है कि कैसे मैं इस निष्कर्ष निकाला ... मैं संकेत दिया अंक तोड़ने सेट भूल गया टिप्पणियों में। जब दौड़ते हैं, तो यह पहले ब्रेक पॉइंट पर रुक जाता है।
संपादित करें: यह मेरा अपडेट किए गए कोड
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 /*
अब, WaitNamedPipe()
लौटने Connect()
और GetLastError()
को दूसरी कॉल 2, या ERROR_FILE_NOT_FOUND
लौटने पर झूठा?
सलाह का एक शब्द: '\\', '\ p' और' \ t' को बचने वाले पात्रों के रूप में व्याख्या करने जा रहे हैं। या तो "बच निकलने" से बचने के लिए स्लैश या डबल बैकस्लैश को आगे बढ़ाने के लिए स्विच करें: '"\\\\। \\ पाइप \\ test" '। – Xeo
वह एक टाइपो था ... मैंने इसे सही किया ... –