qt,mfc, windows 进程间共享内存通讯

mfc:  

CreateFileMapping 创建map,

MapViewOfFile  打开map,

UnmapViewOfFile(m_hMapFile);释放map

 CloseHandle(m_hMapFile);关闭句柄

//自定义定义

#define MSG_MSG3 (WM_USER + 102)

//创建map

int Cp1Dlg::MapFile()
{
	CString str;
	m_edit7.GetWindowTextA(str);
	if(str.GetLength() == 0)
	{
		AfxMessageBox("File Mapping Name can't be NULL");
		return -1;
	}
	m_hMapFile = CreateFileMapping(
		INVALID_HANDLE_VALUE,
		NULL,
		PAGE_READWRITE,
		0,
		BUF_SIZE,
		str.GetBuffer());
	if(m_hMapFile == NULL)
	{
		AfxMessageBox("CreateFileMapping failed!");
		return 1;
	}
	m_pBuf = static_cast<LPTSTR>(MapViewOfFile(
		m_hMapFile,
		FILE_MAP_ALL_ACCESS,
		0,
		0,
		BUF_SIZE));
	if(m_pBuf == NULL)
	{
		AfxMessageBox("MapViewOfFile failed!");
		CloseHandle(m_hMapFile);
		return 1;
	}
	return 0;
}

//创建进程
void Cp1Dlg::OnBnClickedButton2()
{
	//create new sub process
	STARTUPINFO si = {sizeof(si)};
	PROCESS_INFORMATION pi;
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = TRUE;
	CreateProcess(
		NULL, 
		"p1.EXE",
		NULL,
		NULL,
		TRUE,
		0,
		NULL,
		NULL,
		&si,
		&pi
		);
}


//发送消息

void Cp1Dlg::OnBnClickedOk2()
{
	m_nMsg = MSG_MSG3;
	if(m_nMsg == -1)
	{	
		AfxMessageBox("Please select Message Type");
		return;
	}
	CString str;
	long lval;
	m_edit2.GetWindowTextA(str);
	lval = atol(str.GetBuffer());
	if(lval == 0)
	{
		AfxMessageBox("Remote Window Handle can't be NULL");
		return;
	}
	WPARAM wParam;
	LPARAM lParam;
	//write buffer
	m_edit6.GetWindowTextA(str);
	memcpy((void*)m_pBuf, str.GetBuffer(), str.GetLength());
	str = "S:\t" + str;
	m_list2.AddString(str);
	m_edit4.GetWindowTextA(str);
	wParam = atol(str.GetBuffer());
	m_edit5.GetWindowTextA(str);
	lParam = atol(str.GetBuffer());
	::SendMessage((HWND)lval, m_nMsg, wParam, lParam);
}

//mfc  消息绑定
BEGIN_MESSAGE_MAP(Cp1Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &Cp1Dlg::OnBnClickedOk)
	ON_BN_CLICKED(IDC_RADIO1, &Cp1Dlg::OnBnClickedRadio1)
	ON_BN_CLICKED(IDC_RADIO2, &Cp1Dlg::OnBnClickedRadio2)
	ON_BN_CLICKED(IDC_RADIO3, &Cp1Dlg::OnBnClickedRadio3)
	ON_MESSAGE(MSG_MSG3, &Cp1Dlg::OnMsg3)//监听自定义消息
	ON_BN_CLICKED(IDC_BUTTON1, &Cp1Dlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDOK2, &Cp1Dlg::OnBnClickedOk2)
	ON_BN_CLICKED(IDOK3, &Cp1Dlg::OnBnClickedOk3)
END_MESSAGE_MAP()

//处理收到的消息
LRESULT Cp1Dlg::OnMsg3(WPARAM wParam, LPARAM lParam){
	CString str;
	str.Format("R:\t%s", m_pBuf);
	m_list2.AddString(str);
	if (lstrcmp(m_pBuf,_T("quit")) == 0)//读取 内存共享的数据
	{
		AfxMessageBox("准备退出");
		EndDialog(-1);
	}
	else if (lstrcmp(m_pBuf, _T("notepad")) == 0)
	{
		//create new sub process
		STARTUPINFO si = { sizeof(si) };
		PROCESS_INFORMATION pi;
		si.dwFlags = STARTF_USESHOWWINDOW;
		si.wShowWindow = TRUE;
		CreateProcess(
			NULL,
			"notepad.exe",
			NULL,
			NULL,
			TRUE,
			0,
			NULL,
			NULL,
			&si,
			&pi
		);

	}
	memset((void*)m_pBuf, 0, BUF_SIZE);
	return 0;
}

QT   QSharedMemory 共享内存

 

QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	ui.textEdit->setText(QString::number(QWidget::winId()));
    //创建进程变量
	m_process = new QProcess();

}



//qt 监听 Windows消息

bool QtWidgetsApplication1::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
	MSG *param = static_cast<MSG *>(message);

	switch (param->message)
	{
	case MSG_MSG3:
	{
		/*COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(param->lParam);*/
		QSharedMemory sharedMemory;
		QString mapNmae = ui.textEdit_3->toPlainText();
		sharedMemory.setNativeKey(mapNmae);
		if (!sharedMemory.attach(QSharedMemory::ReadOnly))
		{
			qDebug() << "atttach fail";
			return false;
		}
        //收到消息  后开始读取  共享内存的数据
		sharedMemory.lock();
		//p = reinterpret_cast<LPCTSTR>(sharedMemory.data());
		char *memData = new char[256];
		memset(memData, 0, 256);
		//memData = (char*)sharedMemory.data();
		memcpy(memData, (char*)sharedMemory.data(), 256);
		sharedMemory.unlock();
		sharedMemory.detach();
		ui.textEdit_4->setText(QString::fromLocal8Bit(memData));
		delete[] memData;
		*result = 1;
		return true;
		break;
	}
	}

	return QWidget::nativeEvent(eventType, message, result);

}

//如果共享内存名称存在则打开,不存在则创建

void QtWidgetsApplication1::on_pushButton_5_clicked()
{
	QString mapName = ui.textEdit_3->toPlainText();
	if(mapName == "")
	{ 
		QMessageBox::information(NULL, QStringLiteral("提示"), QStringLiteral("请输入MAP名称"));
	}
	else
	{
		sharedMemory.setNativeKey(mapName);
		if (!sharedMemory.attach(QSharedMemory::ReadWrite))
		{
			qDebug() << "atttach fail";
			sharedMemory.create(256, QSharedMemory::ReadWrite);
		}


	}
	
	
}

//发送Windows消息
void QtWidgetsApplication1::on_pushButton_6_clicked()
{

	QMessageBox::information(NULL, "1234", "321");
	//消息内容
	QString msg = ui.textEdit_5->toPlainText(); 
	//进程句柄
	HWND hWnd = 0;
	hWnd = (HWND)ui.textEdit_2->toPlainText().toInt();
	if (msg == "" || hWnd == 0 )
	{
		QMessageBox::information(NULL, QStringLiteral("提示"), QStringLiteral("请输入发送消息内容"));
	}
	else 
	{
        //往共享内存中写数据
		char * str = new char[256];
		memset(str, 0, 256);
		QByteArray ba = msg.toLocal8Bit();
		memcpy(str, ba.data(),256);
		sharedMemory.lock();
		char * to = (char *)sharedMemory.data();
		memcpy(to, str, 256);
		sharedMemory.unlock();
		
		//写完后发消息通知
		SendMessage(hWnd, MSG_MSG3, 0, atol(str));

	}
	
}

//打开一个进程

void QtWidgetsApplication1::on_pushButton_4_clicked()
{

	m_process->start("QtWidgetsApplication1.exe");

}

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑贝是条狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值