天宇受卖命:用File Mapping进行通讯
来源:百度文库 编辑:偶看新闻 时间:2024/05/06 01:23:44
用File Mapping进行通讯
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,
"GlobalCMemMapChannel_Mutex_%s"
, pChannelName);
sprintf
(szFileMapName,
"GlobalCMemMapChannel_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;}
可以用MSComm进行USB通讯吗?
端口映射软件TCP Mapping怎么用
用什么控件才可以进行USB通讯?
目前,人们用哪些通讯工具进行远距离信息交流?
用RS485进行通讯时,需要定义的端口参数有哪些??
蜻蜓是怎样用气味进行通讯的?
请问如何进行远距离串口通讯?
红外线手机如何与电脑进行通讯?
TCP Mapping使用方法
什么是 Information Mapping
我用GHOST进行系统备份时到出现:Aotual file size is less than reported size,ignore?
用通讯照句
在INCLUDE FILE中可以进行参数传递马?
Cross-Linked Peptide Mapping是什么意思
O/R mapping是什么?
两个无线网卡可以实现PC之间进行通讯吗
手机能同时和几个基站进行通讯?
潜水艇在水下是如何与地面进行通讯的?
windows 与 linux 之间进行通讯需要什么协议?
Duplicate File Finder怎么用
mapping sensor什么意思,详细一点
Value Stream Mapping中文什么意思?
谁知道数码相机里的PIXET MAPPING是什么意思~
请问RealMedia File应该用什么播放?