Отображаемые в память файлы в Windows - PullRequest
0 голосов
/ 10 мая 2011

Я читаю об общей памяти, и в книге по ОС, которую я читаю, приводятся следующие программы производителя / потребителя:

Производитель:

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    HANDLE hFile, hMapFile;
    LPVOID lpMapAddress;

    hFile = CreateFile("temp.txt",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    hMapFile = CreateFileMapping(hFile,
        NULL,
        PAGE_READWRITE,
        0,
        0,
        TEXT("SharedObject"));

    lpMapAddress = MapViewOfFile(hMapFile,
        FILE_MAP_ALL_ACCESS,
        0,
        0,
        0);

    sprintf(lpMapAddress, "Shared memory message");

    UnmapViewOfFile(lpMapAddress);
    CloseHandle(hFile);
    CloseHandle(hMapFile);
}

Потребитель:

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    HANDLE hMapFile;
    LPVOID lpMapAddress;

    hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,
        FALSE,
        TEXT("SharedObject"));

    lpMapAddress = MapViewOfFile(hMapFile,
        FILE_MAP_ALL_ACCESS,
        0,
        0,
        0);

    printf("Read message %s", lpMapAddress);

    UnmapViewOfFile(lpMapAddress);
    CloseHandle(hMapFile);
}

Проблема в том, что он не компилируется. Visual C ++ 2008 Express выдает эту ошибку в части производителя:

ошибка C2664: «sprintf»: невозможно преобразовать параметр 1 из «LPVOID» в «char *»

В чем проблема?

1 Ответ

0 голосов
/ 10 мая 2011

В C ++ преобразование из 'void *' в указатель на не void требует явного приведения.

sprintf нужен символ *, поэтому необходимо привести указатель void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...