用FileMapping进行通讯

class CMemMapChannel

{

public:

 

#define CMemMapChannel_MAX_DATA_SIZE   4096

 

    typedef struct _MAP_DATA

    {

       DWORD      dwSize;

       CHAR       m_szBuf[CMemMapChannel_MAX_DATA_SIZE];

    }MAP_DATA, * PMAP_DATA;

 

 

    CMemMapChannel(CHAR *pChannelName = NULL);

    virtual ~CMemMapChannel();

 

 

    DWORD  Read(VOID *pData, DWORD dwSize);

    DWORD  Write(VOID *pData, DWORD dwSize = 0);

 

 

    HANDLE        m_MutexLock;

    HANDLE        m_DataMap;

    PMAP_DATA     m_pData;

 

};

 

/

//     class  CMemMapChannel

/

 

 

 

 

CMemMapChannel::CMemMapChannel(CHAR *pChannelName)

{

    CHAR       szMutexName[1024];

    CHAR       szFileMapName[1024];

 

    if(pChannelName == NULL)

       pChannelName = "NULL";

 

    sprintf(szMutexName, "Global//CMemMapChannel_Mutex_%s", pChannelName);

    sprintf(szFileMapName, "Global//CMemMapChannel_FileMap_%s", pChannelName);

 

    m_MutexLock = CreateMutexA(NULL, FALSE, szMutexName);

    if(m_MutexLock == NULL)

    {

       assert(FALSE);

    }

 

    m_DataMap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL,

       PAGE_READWRITE, 0, sizeof(MAP_DATA), szFileMapName);

    if(m_DataMap == NULL)

    {

       assert(FALSE);

    }

 

    m_pData = (PMAP_DATA)MapViewOfFile(m_DataMap, FILE_MAP_WRITE, 0, 0, sizeof(MAP_DATA));

    m_pData->dwSize = 0;

}

 

 

CMemMapChannel::~CMemMapChannel()

{

    if(m_pData)

       UnmapViewOfFile(m_pData);

 

    if(m_DataMap)

       CloseHandle(m_DataMap);

 

    if(m_MutexLock)

       CloseHandle(m_MutexLock);

}

 

 

DWORD  CMemMapChannel::Read(VOID *pData, DWORD dwSize)

{

    DWORD         dwRetVal;

    DWORD         dwReadSize;

 

    dwRetVal = WaitForSingleObject(m_MutexLock, INFINITE);

    if(dwRetVal != WAIT_OBJECT_0 &&

       dwRetVal != ERROR_WAIT_NO_CHILDREN)

       return -1;

 

    if(m_pData->dwSize == 0)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

    if(m_pData->dwSize > dwSize)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

 

    dwReadSize = m_pData->dwSize;

    memcpy(pData, m_pData->m_szBuf, dwReadSize);

    m_pData->dwSize = 0;

 

    ReleaseMutex(m_MutexLock);

    return dwReadSize;

}

 

 

DWORD  CMemMapChannel::Write(VOID *pData, DWORD dwSize)

{

    DWORD         dwRetVal;

    DWORD         dwWriteSize;

 

    dwRetVal = WaitForSingleObject(m_MutexLock, INFINITE);

    if(dwRetVal != WAIT_OBJECT_0 &&

       dwRetVal != ERROR_WAIT_NO_CHILDREN)

       return -1;

 

    if(dwSize == 0)

       dwSize = (DWORD)strlen((CHAR *)pData)+1;

 

    if(m_pData->dwSize != 0)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

    if(dwSize > CMemMapChannel_MAX_DATA_SIZE)

    {

       ReleaseMutex(m_MutexLock);

       return 0;

    }

 

 

    dwWriteSize = dwSize;

    memcpy(m_pData->m_szBuf, pData, dwSize);

    m_pData->dwSize = dwSize;

 

    ReleaseMutex(m_MutexLock);

    return dwWriteSize;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值