C#如何用内存映射一个结构并读写

zx1981226 2010-03-26 11:30:25
private void CreateMapFilebuf()
{
IntPtr intptr = IntPtr.Zero;
try
{
if (!LockMapfile())
{
MessageBox.Show("无法注册用户信息请稍后重启程序!");
return;
}

hMapFile = OpenFileMapping(0x0002 | 0x0004, false, "CMB_GKE_MAPPINGFILE");
if (hMapFile == 0)
{
hMapFile = CreateFileMapping(0xFFFFFFFF, 0, PAGE_READWRITE, 0, size, "CMB_GKE_MAPPINGFILE");
if (hMapFile == 0)
{
MessageBox.Show("初始化内存失败!");
return;
}
}

intptr = MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 0);

Sequentialdata = (DATA)Marshal.PtrToStructure(intptr, typeof(DATA));


Sequentialdata.FromSys = "OS";
Sequentialdata.ClassNamePre = "CLIENT";
Sequentialdata.MsgTyp = "0;1;";
Sequentialdata.MsgNotifyTyp = 0;
Sequentialdata.AppCount = 1;

}
catch
{
}
finally
{
if (intptr != IntPtr.Zero)
{
UnmapViewOfFile(intptr);
}
UnLockMapfile();
}
}


其中 [StructLayout(LayoutKind.Sequential)]
public struct DATA
{
[MarshalAs(UnmanagedType.BStr, SizeConst = 20)]
public string FromSys;
[MarshalAs(UnmanagedType.BStr, SizeConst = 50)]
public string ClassNamePre;
[MarshalAs(UnmanagedType.BStr, SizeConst = 20)]
public string MsgTyp;

public int MsgNotifyTyp;
public int AppCount;
};是定义的结构


但是执行代码时第一次是CreateFileMapping并且映射成功 当修改了
Sequentialdata = (DATA)Marshal.PtrToStructure(intptr, typeof(DATA));

Sequentialdata.FromSys = "OS";
Sequentialdata.ClassNamePre = "CLIENT";
Sequentialdata.MsgTyp = "0;1;";
Sequentialdata.MsgNotifyTyp = 0;
Sequentialdata.AppCount = 1;
之后UnmapViewOfFile(intptr);提交
下次再读取的时候 得到的Sequentialdata还是没有修改前的 请各位看看哪有问题,谢谢
...全文
331 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
phommy 2010-03-26
  • 打赏
  • 举报
回复
Marshal.PtrToStructure
你的代码里都已经写了

也可以用反射把结构体中所有字段枚举出来。
zx1981226 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 asdf311 的回复:]
现有代码不足,无法判断,请贴UnmapViewOfFile方法

PS:请排下版,看没排版的代码是受罪啊~
[/Quote]
UnmapViewOfFile 这个就是调用API的
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool UnmapViewOfFile(IntPtr pvBaseAddress);
wheeler 2010-03-26
  • 打赏
  • 举报
回复
现有代码不足,无法判断,请贴UnmapViewOfFile方法

PS:请排下版,看没排版的代码是受罪啊~
zx1981226 2010-03-26
  • 打赏
  • 举报
回复
谢谢各位,结贴了
xingyuebuyu 2010-03-26
  • 打赏
  • 举报
回复
intptr = MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 0);

Sequentialdata = (DATA)Marshal.PtrToStructure(intptr, typeof(DATA));


Sequentialdata.FromSys = "OS";
Sequentialdata.ClassNamePre = "CLIENT";
Sequentialdata.MsgTyp = "0;1;";
Sequentialdata.MsgNotifyTyp = 0;
Sequentialdata.AppCount = 1;

//加上这个,你要将修改后的结果存到内存映射中,不然就等于没修改。Marshal.PtrToStructure只是去读而已。
Marshal.StructureToPtr(Sequentialdata, intptr, true);

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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