Написать в сопоставленный файл - PullRequest
1 голос
/ 27 января 2020

Я использую библиотеку windows .h, и я использовал 2 процесса, один должен открыть файл, а второй процесс должен изменить первый байт на "Z". Я получаю ошибку во время выполнения при попытке записать в файл «как я могу сделать это правильно?

hFile = CreateFileA(
        pFileName, // file name
        GENERIC_WRITE, // access type
        0, // other processes can't share
        NULL, // security
        OPEN_EXISTING, // open only if file exists
        FILE_ATTRIBUTE_NORMAL,
        NULL);


    // create file mapping object
    HANDLE hMapFile;
    hMapFile = CreateFileMapping(
        hFile, // file handle
        NULL, // default security
        PAGE_READWRITE, // read/write access
        0, // maximum object size (high-order DWORD)
        0, // maximum object size (low-order DWORD)
        // 0 means map the whole file
        L"myFile"); // name of mapping object, in case we
        // want to share it
        // read the file, one page at a time

, и вот второй процесс:

hFile = OpenFileMapping(FILE_MAP_WRITE, TRUE, L"myFile");

    LPVOID lpMapAddress = MapViewOfFile(hFile,            // handle to
                                                      // mapping object
        FILE_MAP_ALL_ACCESS, // read/write
        NULL,                   // high-order 32
                             // bits of file
                             // offset
        NULL,      // low-order 32
                             // bits of file
                             // offset
        NULL);                // number of bytes
    sprintf((char*)lpMapAddress, "Z");
    UnmapViewOfFile(lpMapAddress);
    CloseHandle(hFile);
    CloseHandle(hFile);

1 Ответ

0 голосов
/ 28 января 2020

При попытке записи в файл появляется сообщение об ошибке «Как я могу сделать это правильно?»

Проверка ошибок может помочь вам определить, какая именно ошибка и где это произошло. Перед использованием убедитесь, что значение, возвращенное последней функцией, является действительным.

Ниже приведен пример работы для меня. Вы можете попробовать:

Создать сопоставление файлов в одном процессе.

HANDLE hFile = CreateFileA(
    "test.txt", // file name
    GENERIC_READ | GENERIC_WRITE, // access type
    0, // other processes can't share
    NULL, // security
    OPEN_EXISTING, // open only if file exists
    FILE_ATTRIBUTE_NORMAL,
    NULL);
if (hFile == INVALID_HANDLE_VALUE)
    printf("CreateFileA error: %d \n", GetLastError());


// create file mapping object
HANDLE hMapFile;
hMapFile = CreateFileMapping(
    hFile, // file handle
    NULL, // default security
    PAGE_READWRITE, // read/write access
    0, // maximum object size (high-order DWORD)
    0, // maximum object size (low-order DWORD)
    // 0 means map the whole file
    L"myFile"); // name of mapping object, in case we
    // want to share it
    // read the file, one page at a time
if (hMapFile == NULL)
    printf("CreateFileMapping error: %d \n", GetLastError());

getchar();

Открыть сопоставление файлов в другом.

HANDLE hFile = OpenFileMapping(FILE_MAP_WRITE, TRUE, L"myFile");
if (hFile == NULL)
    printf("OpenFileMapping error: %d \n", GetLastError());

LPVOID lpMapAddress = MapViewOfFile(hFile,            // handle to
                                                  // mapping object
    FILE_MAP_ALL_ACCESS, // read/write
    NULL,                   // high-order 32
                         // bits of file
                         // offset
    NULL,      // low-order 32
                         // bits of file
                         // offset
    NULL);                // number of bytes
if (lpMapAddress == NULL)
    printf("MapViewOfFile error: %d \n", GetLastError());

char newData[] = "Z";

snprintf((char*)lpMapAddress, sizeof(newData), newData);
UnmapViewOfFile(lpMapAddress);
CloseHandle(hFile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...