Не удается отобразить разделяемую память

#c #windows #winapi #shared-memory

#c #Windows #winapi #разделяемая память

Вопрос:

Я хочу создать общую память между 2 процессами. Поэтому я просто скопировал вырезанный фрагмент со страницы Microsoft:

Фрагмент 1:

 #define BUF_SIZE 256
TCHAR szName[] = TEXT("Global\MyFileMappingObject");
TCHAR szMsg[] = TEXT("Message from first process.");

void initSharedMem() {
HANDLE hMapFile;
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)
    BUF_SIZE,                // maximum object size (low-order DWORD)
    szName);                 // name of mapping object

if (hMapFile == NULL) {
    MessageBox(0, "Could not create file mapping object", "Error", 0);
    return;
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
    FILE_MAP_ALL_ACCESS, // read/write permission
    0,
    0,
    BUF_SIZE);

if (pBuf == NULL) {
    MessageBox(0, "Could not map view of file", "Error", 0);
    CloseHandle(hMapFile);

    return;
}


CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

MessageBox(0, "Done init shared mem", "Done", 0);
return;
}
  

Фрагмент 2 (другой процесс):

 #define BUF_SIZE 256
TCHAR szName[] = TEXT("Global\MyFileMappingObject");
TCHAR szMsg[] = TEXT("Message from first process.");

void readSharedMem() {
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) {
    MessageBox(0, L"Error", L"Could not open file mapping object", 0);
    return;
}

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

if (pBuf == NULL) {
    MessageBox(0, L"Error", L"Could not map file", 0);

    CloseHandle(hMapFile);

    return;
}

MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

return;

MessageBox(0, L"Done", L"SharedMemoryDone", 0);
}
  

Я вызываю первую функцию в процессе A и получаю сообщение done. Но когда я впоследствии вызываю функцию readSharedMem, я получаю сообщение об ошибке «Не удалось открыть объект сопоставления файлов».

Что я здесь делаю не так?

Комментарии:

1. Ваш процесс A все еще активен, когда вы пытаетесь открыть раздел разделяемой памяти? Кроме того, какой код ошибки вы получаете при OpenFileMapping сбое?

2. Подсказка: никогда не просто копируйте / вставляйте код. В идеале вам следует повторно ввести код, просматривая значение всего, что вы не понимаете. Так вы изучаете новые концепции.

3. Да, оба активны, и код ошибки равен 2.

4. @CodeMouse92 да, я знаю, я просто хотел что-то быстро протестировать и лучше реализовать, если теория работает

5. Код ошибки 2 переводится как «Система не может найти указанный файл».. Это должно дать вам что-то для работы. Вполне может быть, потому что в фрагменте 2 включен Unicode, а в фрагменте 1 нет.

Ответ №1:

Я вызываю первую функцию в процессе A и получаю сообщение done.

К моменту появления сообщения done объект сопоставления файлов уже закрыт, поэтому он больше не существует.

Но когда я впоследствии вызываю функцию readSharedMem, я получаю сообщение об ошибке «Не удалось открыть объект сопоставления файлов».

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

Комментарии:

1. да, так оно и было, я подумал то же самое перед сном. Я попробовал это сейчас, и появляется окно сообщения с «Process2», но теперь есть еще одна проблема. В окне сообщения вместо «Сообщение от первого процесса» несколько китайских букв.. Почему они интерпретируются неправильно?

2. Вероятно, вы возились с настройками Unicode, поскольку некоторые из предыдущих комментариев предполагали, что они могут быть вашей проблемой. (Для справки, вы всегда должны использовать режим Unicode.)