请问如何让两个程序访问同一块内存,谢谢!

ccittbeauty 2006-12-06 09:13:58
请给出具体方法.程序A如何申请一块内存后,然后程序B可以访问得到,并且如何让程序B关掉后,通知程序A退出,并释放内存.

谢谢!
...全文
534 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghyd 2006-12-13
  • 打赏
  • 举报
回复
补充一下,两个事件对象必须在创建的时候使用名字.
ghyd 2006-12-13
  • 打赏
  • 举报
回复
可以这样: 制作一个共享dll.在这个dll里进行内存的 分配和释放.同时,提供一个用来保护共享内存段的互斥事件对象,和一个用来通知其他程序本程序已经退出的事件对象.
trueadou 2006-12-13
  • 打赏
  • 举报
回复
内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保留一段内存区域,把目标文件映射到这段虚拟内存中。在程序实现中必须考虑各进程之间的同步。具体实现步骤如下:

首先我们在发送数据的进程中需要通过调用内存映射API函数CreateFileMapping创建一个有名的共享内存:
HANDLE CreateFileMapping(
HANDLE hFile, // 映射文件的句柄,
//设为0xFFFFFFFF以创建一个进程间共享的对象
LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 安全属性
DWORD flProtect, // 保护方式
DWORD dwMaximumSizeHigh, //对象的大小
DWORD dwMaximumSizeLow,
LPCTSTR lpName // 必须为映射文件命名
);

与虚拟内存类似,保护方式可以是PAGE_READONLY或是PAGE_READWRITE。如果多进程都对同一共享内存进行写访问,则必须保持相互间同步。映射文件还可以指定PAGE_WRITECOPY标志,可以保证其原始数据不会遭到破坏,同时允许其他进程在必要时自由的操作数据的拷贝。

在创建文件映射对象后使用可以调用MapViewOfFile函数映射到本进程的地址空间内。

下面说明创建一个名为MySharedMem的长度为4096字节的有名映射文件:
HANDLE hMySharedMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF),
NULL,PAGE_READWRITE,0,0x1000,"MySharedMem");
并映射缓存区视图:
LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

其他进程访问共享对象,需要获得对象名并调用OpenFileMapping函数。
HANDLE hMySharedMapFile=OpenFileMapping(FILE_MAP_WRITE,
FALSE,"MySharedMem");

一旦其他进程获得映射对象的句柄,可以象创建进程那样调用MapViewOfFile函数来映射对象视图。用户可以使用该对象视图来进行数据读写操作,以达到数据通讯的目的。

当用户进程结束使用共享内存后,调用UnmapViewOfFile函数以取消其地址空间内的视图:
if (!UnmapViewOfFile(pszMySharedMapView))
{ AfxMessageBox("could not unmap view of file"); }
trueadou 2006-12-13
  • 打赏
  • 举报
回复
仅定义一个数据段还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方法可以实现该目的(其效果是相同的),一种方法是在.DEF文件中加入如下语句:

  SETCTIONS .shared READ WRITE SHARED

  另一种方法是在项目设置链接选项中加入如下语句:

  /SECTION:.shared,rws
ccittbeauty 2006-12-13
  • 打赏
  • 举报
回复
不是系统级的hook,是因为PCI上两种视频采集卡,因为数据量很大,如果同时采集,可能会出现图像错帧(即一帧数据顺序错误的现象),所以想申请一块连续的静态内存,而且最好能像类似像显卡占内存的那种方式一样锁死,请问有没有好的办法?
yjgx007 2006-12-06
  • 打赏
  • 举报
回复
如果是系统级hook, 在DLL中设置共享数据段
Sample Code

#pragma data_seg(".shared")
int iSharedVar = 0;
#pragma data_seg()
The first line directs the compiler to place all the data declared in this section into the .shared data segment. Therefore, the iSharedVar variable is stored in the .shared segment. By default, data is not shared. Note that you must initialize all data in the named section. The data_seg pragma applies only to initialized data. The third line, #pragma data_seg(), resets allocation to the default data section.

通常,你可以用SetWindowsHookEx在DLL中挂钩另一个进程的退出消息(WM_CLOSE).
fengge8ylf 2006-12-06
  • 打赏
  • 举报
回复
内存映射文件

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧