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");
}