MFC 进程间通信(共享内存)

应用:32位SDK与64位进程间通信

目录

1.定义        

1.1接收线程

2.初始化

3.发送

4.退出

1.定义        

        共享文件句柄、映射缓冲区视图

// FW64To32Dlg.h : 头文件

	HANDLE shared_file;		//共享文件句柄
	LPVOID lpBUF;			//映射缓冲区视图

	bool bStopRev;			//停止接收

// FW64To32Dlg.cpp : 实现文件                

#include <iostream>
#include <comdef.h>
#include <Windows.h>

using namespace std;
#define BUF_SIZE 4096

HANDLE H_Mutex = NULL;
HANDLE H_Event = NULL;


HANDLE H_Mutex_REV = NULL;
HANDLE H_Event_REV = NULL;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define EXCHANGE_REV_SEND 1

#if EXCHANGE_REV_SEND
#define REV_E_TEXT L"sm_event_rev"
#define REV_M_TEXT L"sm_mutex_rev"
#define E_TEXT L"sm_event"
#define M_TEXT L"sm_mutex"
#else
#define REV_E_TEXT L"sm_event"
#define REV_M_TEXT L"sm_mutex"
#define E_TEXT L"sm_event_rev"
#define M_TEXT L"sm_mutex_rev"
#endif

1.1接收线程

        采用:AfxBeginThread方式

UINT ThreadProc(LPVOID pParam)
{
	CFW64To32Dlg* pThis =  (CFW64To32Dlg*)pParam;

	if(pThis== NULL)
	{
		return 0;
	}


	//循环接收
	char Buff[97];
	while(1&&!(pThis->bStopRev))
	{		
		WaitForSingleObject(H_Event_REV, INFINITE);
		WaitForSingleObject(H_Mutex_REV, INFINITE);//使用互斥体加锁
		memcpy(Buff, pThis->lpBUF, strlen((char*)(pThis->lpBUF))+1);
		ReleaseMutex(H_Mutex_REV);
		
		int nSizeBuff=strlen(Buff);
		Buff[nSizeBuff] = '\0';
		 CString szTest(Buff);  
		//szTest.Format(_T("%s"),Buff);//乱码

		CString cStrReceive;
		pThis->m_TxtReceive.GetWindowText(cStrReceive);
		cStrReceive +=L"\r\n" + szTest;
		pThis->m_TxtReceive.SetWindowText(cStrReceive);
	}
	AfxEndThread(1);
	return 0;
}

2.初始化

        创建共享文件句柄

        映射缓冲区视图,得到指向共享内存的指针

        启动接收线程:AfxBeginThread

BOOL CFW64To32Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// ...

	// TODO: 在此添加额外的初始化代码
	//S1:创建共享文件句柄
	shared_file= CreateFileMapping(INVALID_HANDLE_VALUE,//物理文件句柄CreateFileMapping
	NULL,//默认安全级别
	PAGE_READWRITE,//可读可写
	0,//高位文件大小
	BUF_SIZE,//低位文件大小
	L"ShareMemory"//共享内存名称
	);
	
	if(shared_file == NULL)
	{
		cout<<"Could not create file mapping object..."<<endl;
		return 1;
	}

	//S2:映射缓冲区视图,得到指向共享内存的指针
	lpBUF = MapViewOfFile(
	shared_file,//已创建的文件映射对象句柄
	FILE_MAP_ALL_ACCESS,//访问模式:可读写
	0,//文件偏移的高32位
	0,//文件偏移的低32位
	BUF_SIZE
	);
	if(lpBUF==NULL)
	{
		cout<<"Could not create file mapping object..."<<endl;
		CloseHandle(shared_file);
		return 1;
	}

	//发送
	H_Mutex = CreateMutex(NULL, FALSE, M_TEXT);
	H_Event = CreateEvent(NULL, FALSE, FALSE, E_TEXT);

	//接收
	H_Mutex_REV = CreateMutex(NULL, FALSE, REV_M_TEXT);
	H_Event_REV = CreateEvent(NULL, FALSE, FALSE, REV_E_TEXT);

	bStopRev=false;
	CWinThread* pThread = AfxBeginThread(ThreadProc, this);


	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

3.发送

        操作共享内存:填充数据;

void CFW64To32Dlg::OnBnClickedSend()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strSend;
	m_TxtSend.GetWindowText(strSend);
	if(strSend=="" )
	{
		::AfxMessageBox(L"发送内容不能为空!");

		m_TxtSend.SetFocus();
        return;
	}

	//S3:操作共享内存
	wchar_t* wBuff=(LPTSTR)(LPCTSTR)strSend;
	_bstr_t b(wBuff);
	const char* Buff = b;
	WaitForSingleObject(H_Mutex, INFINITE);//使用互斥体加锁
	memcpy(lpBUF, Buff, strlen(Buff)+1);
	ReleaseMutex(H_Mutex);
	SetEvent(H_Event);
}

4.退出

        停止接收

        解除映射和关闭句柄

void CFW64To32Dlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	bStopRev=true;
	SetEvent(H_Event_REV);
	Sleep(1000);

	CloseHandle(H_Mutex);
	CloseHandle(H_Event);
	
	CloseHandle(H_Mutex_REV);
	CloseHandle(H_Event_REV);

	//S4:解除映射和关闭句柄
	UnmapViewOfFile(lpBUF);
	CloseHandle(shared_file);


	CDialogEx::OnClose();
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值