首先,进程A 创建一个命名内存映射对象
其次,进程B 通过名称来访问进程A创建的内存映射对象
上面操作都成功后就可以进行通信,通信的同步处理可以用命名的事件、信号量等内核对象来实现
//创建内存映射对象
static HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE
, NULL
, PAGE_READWRITE|SEC_COMMIT
, 0,sizeof(DWORD)
,L"FileMapLink");
if (NULL == hFileMap)
{
switch(GetLastError())
{
case ERROR_FILE_INVALID:
TRACE("CreateFileMapping Error:企图创建一个零长度的文件映射\r\n");
break;
case ERROR_INVALID_HANDLE:
TRACE("CreateFileMapping Error:ERROR_INVALID_HANDLE\r\n");
break;
case ERROR_ALREADY_EXISTS:
TRACE("CreateFileMapping Error:已有一个同名内存映射存在.\r\n");
break;
}
return;
}
//访问内存映射对象
static VOID* pViewMap = MapViewOfFile( hFileMap
, FILE_MAP_WRITE //访问方式
, 0, 0, 0);
if (NULL == pViewMap)
{
TRACE("MapViewOfFile Error:访问内存映射对象失败.\r\n");
return;
}
//向映射内存写入数据
*((DWORD*)pViewMap) = GetCurrentProcessId();
//创建一个通知事件
static HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, L"EventLink");
if (NULL == hEvent)
{
TRACE("CreateEvent Error:创建失败.\r\n");
return;
}
//通知对方,内存中已有数据,可以进行读取
SetEvent(hEvent);
//不使用是,释放资源
UnmapViewOfFile(pViewMap);
CloseHandle(hFileMap);
CloseHandle(hEvent);
下面展示,进程B如何来访问进程A的数据
static HANDLE hFileMap = OpenFileMapping(FILE_MAP_READ, FALSE, L"FileMapLink");
if (NULL == hFileMap)
{
TRACE("OpenFileMapping Error:打开内存映射对象失败.\r\n");
}
else
{
static HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, L"EventLink");
if (NULL == hEvent)
{
TRACE("OpenEvent Error:访问事件失败.\r\n");
}
else
{
if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 5000))
{
static void* pBuf = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
if (pBuf)
{
DWORD dwCurrProcessID = *((DWORD*)pBuf);
TRACE("CMockShim>> OXProvider ProcessID = %d", dwCurrProcessID);
//LOGON_INFO* pstLogonInfo = (LOGON_INFO*)pBuf;
//TRACE("pstLogonInfo->szUserName = %s\r\n", pstLogonInfo->szUserName);
//TRACE("pstLogonInfo->szUserPwd = %s\r\n", pstLogonInfo->szUserPwd);
}
UnmapViewOfFile(pBuf);
}
}
} CloseHandle(hFileMap); CloseHandle(hEvent);
2662

被折叠的 条评论
为什么被折叠?



