C# 具有内存映射文件的共享内存 我创建了两个应用程序:一个C语言,一个C++程序,我想在两个应用程序之间使用共享内存来进行IPC。对于共享内存,我使用内存映射文件
C#应用程序将创建MemoryMappedFile并向其中写入数据:C# 具有内存映射文件的共享内存 我创建了两个应用程序:一个C语言,一个C++程序,我想在两个应用程序之间使用共享内存来进行IPC。对于共享内存,我使用内存映射文件,c#,c++,memory-management,shared-memory,memory-mapped-files,C#,C++,Memory Management,Shared Memory,Memory Mapped Files,C#应用程序将创建MemoryMappedFile并向其中写入数据: using System; using System.IO; using System.IO.MemoryMappedFiles; using System.Threading; namespace Test { class Program { static void Main(string[] args) { using (MemoryMappedFi
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
namespace Test
{
class Program
{
static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("testmap", 256))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write("Hello, world!");
}
}
Console.ReadKey();
}
}
}
C++应用程序将读取共享内存的值:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")
#define BUF_SIZE 256
TCHAR szName[] = TEXT("testmap");
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not open file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
#包括
#包括
#包括
#包括
#pragma注释(lib,“user32.lib”)
#定义BUF_大小256
TCHAR szName[]=文本(“测试地图”);
int_tmain()
{
处理hMapFile;
LPCTSTR-pBuf;
hMapFile=OpenFileMapping(
文件映射所有访问权限,//读/写访问权限
FALSE,//不继承名称
szName);//映射对象的名称
if(hMapFile==NULL)
{
_tprintf(文本(“无法打开文件映射对象(%d)。\n”),
GetLastError());
返回1;
}
pBuf=(LPTSTR)MapViewOfFile(hMapFile,//映射对象的句柄
文件\u映射\u所有\u访问,//读/写权限
0,
0,
大小);
if(pBuf==NULL)
{
_tprintf(文本(“无法映射文件(%d)的视图)。\n”),
GetLastError());
CloseHandle(hMapFile);
返回1;
}
MessageBox(NULL、pBuf、文本(“进程2”),MB_OK);
未经批准的文件(pBuf);
CloseHandle(hMapFile);
返回0;
}
首先,我将运行C++应用程序创建共享内存,然后运行C++应用程序从共享内存读取数据。但是我在C++应用程序中遇到了异常:“无法打开文件映射对象(2)”。是因为.NET中内存映射文件与我在这里使用的C++内存映射文件不兼容吗?如果是这样的话,有没有我可以用来在C++和C语言应用程序之间共享内存的库?或者我在代码的某个地方出错了
更新:这是我的C代码中的一个bug,Console.ReadKey()应该在using块中!感谢塞维林。你说的“创造”是什么意思?在你的c#示例中,它是在
中使用的
,所以当你到达ReadKey
时,我认为你的映射消失了,被破坏了。@Severin,你是对的!嗯,真是个愚蠢的错误,谢谢你,伙计。