源码地址:https://download.csdn.net/download/qq_35241071/12087301
一、qt实现
1、写入
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pSharedMemory = new QSharedMemory("mcq123");
}
MainWindow::~MainWindow()
{
delete ui;
}
//写入
void MainWindow::on_pushButton_clicked()
{
if(m_pSharedMemory->isAttached())
{
if(!m_pSharedMemory->detach())
{
ui->textBrowser->append("SharedMemory detach failed!");
return;
}
}
//结构体 转 QByteArray
QByteArray array;
Camera_Control_Stru stru;
stru.cmdId = Command_Set_Zoom;
stru.cameraPos = Camera_Top;
stru.zoomValue = 12;
array.append((char *)&stru, sizeof(stru));
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out<<array;
if(!m_pSharedMemory->create( int(buffer.size()) ) )
{
ui->textBrowser->append("SharedMemory created failed!");
return;
}
m_pSharedMemory->lock();
char *to=(char*)m_pSharedMemory->data();
const char *from=buffer.data().data();
memcpy(to, from, qMin(m_pSharedMemory->size(), (int)buffer.size()));
m_pSharedMemory->unlock();
}
2、读出
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSharedMemory>
#include <QBuffer>
#include <QDataStream>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pSharedMemory = new QSharedMemory("mcq123");
}
MainWindow::~MainWindow()
{
delete ui;
}
//读出
void MainWindow::on_pushButton_clicked()
{
if(!m_pSharedMemory->attach())
{
ui->textBrowser->append("SharedMemory attach failed!");
return;
}
QBuffer buffer;
QDataStream in(&buffer);
QByteArray array;
m_pSharedMemory->lock();
buffer.setData((char *)m_pSharedMemory->constData(), m_pSharedMemory->size());
buffer.open(QBuffer::ReadOnly);
in>>array;
m_pSharedMemory->unlock();
m_pSharedMemory->detach();
//QByteArray 转 结构体
Camera_Control_Stru *pStru = (Camera_Control_Stru *)array.data();
ui->textBrowser->append(QString::number(pStru->cmdId));
ui->textBrowser->append(QString::number(pStru->cameraPos));
ui->textBrowser->append(QString::number(pStru->zoomValue));
}
二、纯c++实现
#ifndef CSHAREDMEMORY_H
#define CSHAREDMEMORY_H
#include <iostream>
#include <Windows.h>
#define INPUT_SIZE 100 //内存空间的大小
#define MAP_NAME L"Global\\SampleMap"
//指令id
enum CMD_ENUM{
Command_Invalid, //无效指令
Command_Set_Zoom, //设置放大倍数
Command_Update_Zoom //更新放大倍数
};
//相机位置
enum CAMERA_POS_ENUM{
Camera_Top,
Camera_Side
};
//数据结构
struct Camera_Control_Stru{
int cmdId; //指令id
int cameraPos; //相机位置
int zoomValue; //放大倍数
Camera_Control_Stru()
{
memset(this, 0, sizeof (Camera_Control_Stru));
}
};
class CSharedMemory
{
public:
CSharedMemory();
~CSharedMemory();
bool write_SharedMemory(Camera_Control_Stru *pStru);
bool read_SharedMemory(Camera_Control_Stru &stru);
private:
//共享内存句柄
HANDLE m_FileMap_Handle;
LPVOID m_pShareMemory;
HANDLE m_hMutex;
};
#endif // CSHAREDMEMORY_H
#include "CSharedMemory.h"
CSharedMemory::CSharedMemory()
{
//创建锁,跨进程使用
m_hMutex = CreateMutex(nullptr, NULL, L"Mutex_Camera");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
m_hMutex = OpenMutex(MUTEX_ALL_ACCESS, NULL, L"Mutex_Camera");
}
///1.创建共享内存句柄
SetLastError(NO_ERROR);
m_FileMap_Handle = CreateFileMapping(INVALID_HANDLE_VALUE,
nullptr,
PAGE_EXECUTE_READWRITE,
0,
INPUT_SIZE,
MAP_NAME);
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
//打开共享的文件对象
m_FileMap_Handle = OpenFileMappingW(FILE_MAP_ALL_ACCESS,
NULL,
MAP_NAME);
}
///2.得到共享内存的指针
m_pShareMemory = MapViewOfFile(m_FileMap_Handle,
FILE_MAP_ALL_ACCESS,
0,
0,
INPUT_SIZE);
}
CSharedMemory::~CSharedMemory()
{
///4.解除映射
if(m_pShareMemory)
{
UnmapViewOfFile(m_pShareMemory);
}
///5.关闭句柄
if(m_FileMap_Handle)
{
CloseHandle(m_FileMap_Handle);
m_FileMap_Handle = nullptr;
}
}
/*************************************************
<函数名称> write_SharedMemory
<功 能> 写共享内存
<参数说明> key:共享内存标识
pStru:需要写入的结构体指针
<返 回 值> 是否写入成功
<函数说明> 无
**************************************************/
bool CSharedMemory::write_SharedMemory(Camera_Control_Stru *pStru)
{
if(nullptr == m_pShareMemory)
{
return false;
}
WaitForSingleObject(m_hMutex, INFINITE);
Camera_Control_Stru *pStruTemp = (Camera_Control_Stru *)m_pShareMemory;
pStruTemp->cmdId = pStru->cmdId;
pStruTemp->cameraPos = pStru->cameraPos;
pStruTemp->zoomValue = pStru->zoomValue;
ReleaseMutex(m_hMutex);
return true;
}
/*************************************************
<函数名称> read_SharedMemory
<功 能> 读共享内存
<参数说明> key:共享内存标识
stru:读到的数据结构体
<返 回 值> 是否读取成功
<函数说明> 无
**************************************************/
bool CSharedMemory::read_SharedMemory(Camera_Control_Stru &stru)
{
if(nullptr == m_pShareMemory)
{
return false;
}
WaitForSingleObject(m_hMutex, INFINITE);
stru = *((Camera_Control_Stru *)m_pShareMemory);
ReleaseMutex(m_hMutex);
return true;
}