获取从文件映射的缓冲区,该缓冲区是使用C,Windows在另一个进程上创建的

时间:2019-01-22 08:44:33

标签: c# c windows shared-memory

在C中使用2个进程,第一个进程用于CreateFileMapping进行缓冲,第二个进程获取MapViewOfFile并对其进行更改

帮忙做作业,我只是不知道该怎么做...我没有找到任何例子...

我的C代码:

#include <stdio.h>
#include <Windows.h>

int main(void)
{
    HANDLE hMapFile = CreateFileA("C:\\Users\\hed-b\\source\\repos\\Project2\\Project2\\gibrish", GENERIC_ALL, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    LPCTSTR pBuf;

    hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // use paging file
        NULL,                    // default security
        PAGE_READWRITE,          // read/write access
        0,                       // maximum object size (high-order DWORD)
        NULL,
        "myfile");                 // name of mapping object

    if (hMapFile == NULL)
    {
        _tprintf(TEXT("Could not create file mapping object (%d).\n"),
            GetLastError());
        return 1;
    }
    DWORD MyFileSize = GetFileSize(hMapFile, NULL);

    pBuf = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
        FILE_MAP_ALL_ACCESS, // read/write permission
        0,
        0,
        MyFileSize);

    if (pBuf == NULL)
    {
    /*  _tprintf(TEXT("Could not map view of file (%d).\n"),
            GetLastError());*/

        CloseHandle(hMapFile);

        return 1;
    }

    CopyMemory((PVOID)pBuf, "A", (1 * sizeof(TCHAR)));

    _getch();

    UnmapViewOfFile(pBuf);

    CloseHandle(hMapFile);

    return 0;
}

我试图用C#来做到这一点

第一个程序:

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("C:\\Users\\hed-b\\source\\repos\\Project2\\Project2\\gibrish", FileMode.Open, "sharedBuffer"))
        {

            Console.WriteLine("Start Process B and press ENTER to continue.");
            Console.ReadLine();
        }
    }
}

第二个程序:

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.Threading;

class Program
{
    // Process B:
    static void Main(string[] args)
    {
        using (var mmf = MemoryMappedFile.OpenExisting("sharedBuffer"))
        {
            using (var accessor = mmf.CreateViewAccessor())
            {
                accessor.Write(1, 'A');
            }
        }
    }
}

C程序运行正常...但是我不知道如何将其拆分为2个进程。 最佳做法是什么?是否可以通过HANDLE hMapFile作为参数?

或者我可以使用MapViewOfFile之外的其他名称,例如使用地图名称:“ myfile”而不是HANDLE,就像我在该C#程序中所做的那样

0 个答案:

没有答案