📄 sh_mailslot.cpp
字号:
// SH_Mailslot.cpp: implementation of the SH_Mailslot class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SH_Mailslot.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
SH_Mailslot::SH_Mailslot()
{
m_hMailslot = INVALID_HANDLE_VALUE;
memset(&m_RO,0,sizeof(OVERLAPPED));
memset(&m_SO,0,sizeof(OVERLAPPED));
m_RO.hEvent = CreateEvent(NULL, true, false, NULL);
m_SO.hEvent = CreateEvent(NULL, true, false, NULL);
}
SH_Mailslot::~SH_Mailslot()
{
Close();
if(m_RO.hEvent != INVALID_HANDLE_VALUE)
CloseHandle(m_RO.hEvent);
if(m_SO.hEvent != INVALID_HANDLE_VALUE)
CloseHandle(m_SO.hEvent);
}
BOOL SH_Mailslot::CreateReceiver(const char *name,int timeout)
{
m_hMailslot = CreateMailslot(name,0,timeout,NULL);
if(m_hMailslot == INVALID_HANDLE_VALUE)
{
TRACE("SH_Mailslot open failed.Error no is %d\n",GetLastError());
}
return IsOpen();
}
BOOL SH_Mailslot::CreateSender(const char *name)
{
m_hMailslot = CreateFile(name,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(m_hMailslot == INVALID_HANDLE_VALUE)
{
TRACE("SH_Mailslot open failed.Error no is %d\n",GetLastError());
}
return IsOpen();
}
BOOL SH_Mailslot::Read(char * buf,int len)
{
DWORD cbMessage, cMessage, cbRead;
BOOL bRet;
LPSTR lpszBuffer;
cbMessage = cMessage = cbRead = 0;
if(!GetMailslotInfo(m_hMailslot,(LPDWORD)NULL,&cbMessage,&cMessage,(LPDWORD)NULL))
{
TRACE("SH_Mailslot get mailslot info failed.Error no is %d\n",GetLastError());
return FALSE;
}
if (cbMessage == MAILSLOT_NO_MESSAGE)
return FALSE;
if((int)cbMessage > len)
OutputDebugString("SH_Mailslot:Not enough buffer space\n");
lpszBuffer = (LPSTR)GlobalAlloc(GPTR,cbMessage);
if( NULL == lpszBuffer )
return FALSE;
lpszBuffer[0] = '\0';
bRet = ReadFile(m_hMailslot,lpszBuffer,cbMessage,&cbRead,&m_RO);
if(bRet)
{
int cbsize = len > (int)cbRead ? (int)cbRead:len;
memcpy(buf,lpszBuffer,cbsize);
}
else
TRACE("SH_Mailslot Read failed.Error no is %d\n",GetLastError());
GlobalFree((HGLOBAL) lpszBuffer);
return bRet;
}
BOOL SH_Mailslot::Write(const char * buf,int len)
{
DWORD written = 0;
if(m_hMailslot == INVALID_HANDLE_VALUE)
return FALSE;
if(!WriteFile(m_hMailslot,buf,len,&written,&m_SO))
{
TRACE("SH_Mailslot Write failed.Error no is %d\n",GetLastError());
return FALSE;
}
return TRUE;
}
HANDLE SH_Mailslot::GetSafeHandle() const
{
return m_hMailslot;
}
VOID SH_Mailslot::Close()
{
if(IsOpen())
{
CloseHandle(m_hMailslot);
m_hMailslot = INVALID_HANDLE_VALUE;
}
}
BOOL SH_Mailslot::IsOpen()
{
return (BOOL)(m_hMailslot != INVALID_HANDLE_VALUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -