//CNamedPipe.h
#ifndef __CNAMEDPIPE_H__
#define __CNAMEDPIPE_H__
#define PIPE_UNDF -1
#define PIPE_SERV 0
#define PIPE_CLIN 1
class CNamedPipe
{
public:
CNamedPipe();
~CNamedPipe();
bool Create(char* szPipName, int nMode);
bool Read(void* pBuf, int size, int& nRet);
bool Write(void *pBuf, int size, int& nRet);
void Destroy();
int GetMode();
private:
void* m_hPipe;
int m_nMode;
};
#endif
//CNamedPipe.cpp
#include "CNamedPipe.h"
#include <stdio.h>
#include <string.h>
#include <windows.h>
const DWORD BUFSIZE = 1024;
const DWORD PIPE_TIMEOUT = 5000;
CNamedPipe::CNamedPipe()
{
m_hPipe = INVALID_HANDLE_VALUE;
m_nMode = PIPE_UNDF;
}
CNamedPipe::~CNamedPipe()
{
}
bool CNamedPipe::Create(char* szPipName, int nMode)
{
bool bRet = false;
char szTmp[64];
sprintf(szTmp, "\\\\.\\pipe\\%s", szPipName);
switch (nMode)
{
case PIPE_SERV:
m_hPipe = CreateNamedPipe(szTmp,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
BUFSIZE,
BUFSIZE,
PIPE_TIMEOUT,
NULL);
if (m_hPipe == INVALID_HANDLE_VALUE)
{
bRet = false;
}
else
{
bRet = true;
}
break;
case PIPE_CLIN:
m_hPipe = CreateFile(szTmp,
GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(m_hPipe == INVALID_HANDLE_VALUE)
{
bRet = false;
}
else
{
bRet = true;
}
break;
default: bRet = false;
}
return bRet;
}
bool CNamedPipe::Read(void* pBuf, int nSize, int& nRet)
{
if (ConnectNamedPipe(m_hPipe, NULL) || (GetLastError() == ERROR_PIPE_CONNECTED))
{
DWORD cbBytesRead;
bool fSuccess = (0 != ReadFile(m_hPipe, pBuf, nSize, &cbBytesRead, NULL));
((char *)pBuf)[cbBytesRead] = '\0';
nRet = (int)cbBytesRead;
if (!fSuccess || cbBytesRead == 0)
{
return false;
}
}
return true;
}
bool CNamedPipe::Write(void* pBuf, int nSize, int& nRet)
{
return (0 != WriteFile(m_hPipe, pBuf, nSize, (unsigned long *)&nRet, NULL));
}
void CNamedPipe::Destroy()
{
DisconnectNamedPipe(m_hPipe);
CloseHandle(m_hPipe);
m_hPipe = INVALID_HANDLE_VALUE;
m_nMode = PIPE_UNDF;
}
int CNamedPipe::GetMode()
{
return m_nMode;
}