15,473
社区成员




// 管道线程
UINT CVCPipeServer::PipeServerThread(LPVOID Ptr)
{
CVCPipeServer* psvr = (CVCPipeServer*)Ptr;
if(!psvr)
{
AfxMessageBox(L"获取管道指针失败!");
return -1;
}
HANDLE SvrHandle = psvr->m_SvrHandle;
while(psvr->m_ThreadState)
{
if(WAIT_FAILED==WaitForSingleObject(psvr->m_hEvent,INFINITE))
{
TRACE0("等待对象失败!");
TRACE1("====CREATE PIPE ERROR:%d\n",GetLastError());
CloseHandle(psvr->m_hEvent);
CloseHandle(SvrHandle);
SvrHandle=NULL;
return -1;
}
//读取数据
char* buf = psvr->ReadPipe();
if(!buf)
continue;
//CString str(buf);//读取
if(psvr->m_pFrame)
::SendMessageA(psvr->m_pFrame->GetSafeHwnd(),ID_MESSAGE_FORM_CLIENT,(WPARAM)buf,0);
psvr->DisconnectAndReconnect();//一定要这个才行么?
//SetEvent(psvr->m_hEvent);
//SetEvent(SvrHandle);
}
return 0;
}
CPipeClient::CPipeClient(void)
{
m_SvrHandle=NULL;
LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");
if(!WaitNamedPipe(lpszPipename,2000))
{
//CString err;
//err.Format(_T("WaitNamedPipe失败 错误号:%d"),GetLastError());
TRACE1("WaitNamedPipe失败 错误号:%d",GetLastError());
//AfxMessageBox(err);
return;
}
m_SvrHandle=CreateFile(lpszPipename,GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwMode = PIPE_TYPE_MESSAGE | // message-type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT;
if (INVALID_HANDLE_VALUE==m_SvrHandle)
{
CString err;
err.Format(_T("不能打开命名管道实例 错误号:%d"),GetLastError());
AfxMessageBox(err);
m_SvrHandle=NULL;
return;
}
// Exit if an error other than ERROR_PIPE_BUSY occurs.
/*
BOOL fSuccess = SetNamedPipeHandleState(
m_SvrHandle, // pipe handle
&dwMode, // new pipe mode
NULL, // don't set maximum bytes
NULL); // don't set maximum time
if (!fSuccess)
{
CString err;
err.Format(_T("SetNamedPipeHandleState failed 错误号:%d"),GetLastError());
AfxMessageBox(err);
m_SvrHandle=NULL;
return;
}*/
}
CPipeClient::~CPipeClient(void)
{
if(m_SvrHandle)
CloseHandle(m_SvrHandle);
}
// 读取管道内容
char* CPipeClient::ReadPipe(void)
{
DWORD dwRead;
if(m_SvrHandle==NULL)
return NULL;
memset(m_buf,0,1024);
if(!ReadFile(m_SvrHandle,m_buf,1024,&dwRead,NULL))
return NULL;
return m_buf;
}
// 写入管道
int CPipeClient::WritePipe(LPCTSTR param)
{
if(m_SvrHandle==NULL)
return -1;
memset(m_buf,0,1024);
wcstombs(m_buf, param, 1024 );
OVERLAPPED ovlap;
ZeroMemory(&ovlap,sizeof(OVERLAPPED));
DWORD dwWrite;
if(!WriteFile(m_SvrHandle,m_buf,strlen(m_buf)+1,&dwWrite,&ovlap))
{
CString err;
err.Format(_T("写入数据失败 错误号:%d"),GetLastError());
AfxMessageBox(err);
return -1;
}
return 0;
}