Получить буфер, сопоставленный из файла, созданного в другом процессе с помощью C, Windows - PullRequest
0 голосов
/ 22 января 2019

Используя 2 процесса в C, первый для 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 #

...