http://www.vkfz.com/net-CreateFileMapping-t55403.htm

playroc 发表于 2006-2-27 23:21:08
超级难题:.net 中CreateFileMapping 创建共享内存问题

.net中可以通过InteropServices调用unmanaged库的方法CreateFileMapping等来创建和使用共享内存。但是如何将一个对象数组对应到创建的内存块呢?这样一来,内存创建后就不用管了,只要对对象数组进行操作就可以了,请高手指点。

------------------------------------------------------------------------------------------------------------------------------------
#region 非托管函数声明
[DllImport("kernel32.dll",EntryPoint="OpenFileMapping",SetLastError=true, CharSet=CharSet.Auto) ]
private static extern IntPtr OpenFileMapping (int dwDesiredAccess, bool bInheritHandle,String lpName );

[DllImport("Kernel32.dll",EntryPoint="CreateFileMapping",SetLastError=true,CharSet=CharSet.Auto)]
private static extern IntPtr CreateFileMapping(uint hFile, IntPtr lpAttributes, uint flProtect,uint dwMaximumSizeHigh, uint dwMaximumSizeLow, string lpName);

[DllImport("Kernel32.dll")]
private static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject,uint dwDesiredAccess, uint dwFileOffsetHigh,uint dwFileOffsetLow, uint dwNumberOfBytesToMap);

[DllImport("Kernel32.dll",EntryPoint="UnmapViewOfFile",SetLastError=true,CharSet=CharSet.Auto)]
private static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);

[DllImport("kernel32.dll",EntryPoint="CloseHandle",SetLastError=true,CharSet=CharSet.Auto)]
private static extern bool CloseHandle(uint hHandle);

[DllImport("kernel32.dll",EntryPoint="GetLastError",SetLastError=true,CharSet=CharSet.Auto)]
private static extern uint GetLastError();
#endregion

struct Money
{
public int EmployeeNo;
public float Salary;
};

Money[] g_Money = new Money[100];
for(int i = 0; i < 100; i++)
{
g_Money[i] = new Money();
g_Money[i].EmployeeNo = i;
g_Money[i].Salary = i*i;
}

try
{
IntPtr memoryFileHandle = CreateFileMapping(0xFFFFFFFF,IntPtr.Zero,(uint)4,0,(uint)(100*8),"SHARE_MEMORY");
if(memoryFileHandle == IntPtr.Zero)
{
MessageBox.Show("Create Share Memory Failed!");
return;
}

g_hMoney = MapViewOfFile(memoryFileHandle,(uint)983071,0,0,(uint)(100*8));
if(g_hMoney == IntPtr.Zero)
{
MessageBox.Show("Create Share Memory Failed!");
return;
}

int basePos = g_hMoney.ToInt32();
for(int j = 0; j < 100; j++)
{
//我现在的做法,每次将数组对象g_Money一个一个的复制到内存中去
Marshal.StructureToPtr(g_Money[j], (IntPtr)(basePos + j * 8), true);
//我现在的做法,每次将内存中的数据复制到数组对象g_Money中
// g_Money[j] = (Money)Marshal.PtrToStructure((IntPtr)(basePos + j * 8), typeof(Money));
}
}
catch(System.Exception exception)
{
MessageBox.Show(exception.Message);
}

我想要得到的效果就是:只要访问g_Money数组就可以直接访问内存,象VC中一样,不要每次对g_Money赋值后再调用Marshal.StructureToPtr修改内存,而每次内存修改后又用Marshal.StructureToPtr读取内存到g_Money来

============================
看了一些API,找了一些资料,对这个内存共享还不是很了解。但听同事说在日志管理上还是可以用得上的,特别是多进程间日志管理,这个问题我遇到好久了,就先收集一些文章,到后面再慢慢的学习使用吧。
上面的代码我还没有测试过,看了一下,觉得有些错误,一会我自己试试,同时对这个内存共享问题也多了解一些。

转载于:https://www.cnblogs.com/WuCountry/archive/2006/08/14/476220.html

进程间内存共享问题[转]相关推荐

  1. symbian进程间内存共享

    最近看了一些进程间通讯的资料,基本上原理是一样的,在一个线程开一个全局的服务,另外一个可以通过全名字,或者部分名字查找这个服务,然后取得这个全局服务的内存地址,得到内存中的数据. 在symbian上有 ...

  2. linux进程间通讯-共享内存

    文章目录 共享内存概述 共享内存的特点 共享内存操作 在ubuntu 12.04中共享内存限制值如下 获得一个共享存储标识符 创建共享内存 共享内存映射(attach) 解除共享内存映射(detach ...

  3. WIN32 进程间通讯-共享内存

    一.引言     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...

  4. 进程间基于共享存储区的通信_IPC(进程间通讯):inter process communication

    管道 (1)管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: (2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): (3)**单独构成一种独立的文件系统:**管道 ...

  5. python multiprocessing 进程间如何共享数据、对象

    参考文章1:Python 进程间的数据共享 参考文章2:Python多进程编程-进程间共享 对象

  6. linux进程实现进程通信内存共享,Linux进程间通信 -3内存共享

    内存共享允许两个或多个不相关的进程,访问同一个逻辑内存,共享内存的具体实现,由不同进程之间共享的内存安排为同一物理内存. 过个进程就像通过malloc获取的内存一样去使用,但是需要额外的小消息来同队内 ...

  7. 开启子进程的两种方式、进程间内存空间隔离、进程对象的方法或属性详解

    1.操作系统(推荐查看书籍:现代操作系统)     操作系统是位于计算机硬件与软件之间的控制程序     作用:         1.将硬件的复杂操作封装成简单的接口,给用户或者应用程序使用      ...

  8. 进程间通信(1) dll 实现进程的内存共享

    1. 两个进程访问同一个dll 2.写入时复制(CopyOnWrite,简称COW)思想 如果有多个调用者(Callers)同时访问相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针 ...

  9. c++ 内存映射文件进程间共享数据

    int main(int argc, char *argv[])   {       //RecursiveDelete("C:\\20_128\\");       //Self ...

最新文章

  1. 每日英语:China's Youth to Employers: I Quit
  2. Python中time模块详解
  3. /lib64/libc.so.6 is not a symbolic link 解决方法
  4. rails3使用ActionMail发送邮件
  5. python class函数报错_Python 的函数是第一类 First-Class 对象
  6. 图像处理傅里叶变换的理解及其matlab实现
  7. 单体 soa 微服务 区别_漫谈何时从单体架构迁移到微服务?
  8. Could not find support-media-compat.aar
  9. python填空题_Python题库-填空题
  10. 满二叉树及完全二叉树的相关性质证明
  11. 视觉SLAM笔记(60) 建图
  12. [APIO2011] 方格染色
  13. LeetCode(461)——汉明距离(JavaScript)
  14. 中国开源激荡 20 年:IT 江湖,谁主沉浮?
  15. win10 使用量产工具后usb无法 识别硬件修复 Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Contro
  16. 致远互联开始向云端生态发力奔跑
  17. 集成软件开发环境WipeOut
  18. 必做作业三_ShareX结构化原型设计
  19. usb一致性测试软件,USB 3.0一致性测试方法
  20. 告别传统IT 信天通信助推教育行业云化变革

热门文章

  1. 清华大学计算机系高考生源,清华大学在这个高考大省录取人数创新高,网友:仍然是同分不同命...
  2. 计算机控制系统EHA,优·计算机控制技术第四章.doc
  3. windows和linux存储float,C语言float型数据在内存中的储存方式
  4. android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码
  5. 【JAVA基础篇】反射
  6. 如何在博客中插入背景音乐
  7. css不继承父类样式_提升你的Python编程能力,细说类的继承,拿走不谢
  8. opencv为matlab,OpenCV与matlab部分函数的对应关系(转)
  9. Linux下C/C++程序编译链接加载过程中的常见问题及解决方法
  10. mysql 嵌入式 性能_database – 在mySQL中优化嵌入式SELECT查询