#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.)