Тема: Обмін даними через сторінковий файл
Вивчаю по "Win32 Основи програмування" (ст 371). Це майже точна копія того що там написано.
Для того щоб створити сторінковий файл, цитата, "Для того щоб створити проекцію сторінкового файлу, перший параметр цієї функції повинен бути -1 (і мати тип HANDLE)."
Ця програма створює сторінковий файл і ім'я об'єкта. (вона начебто працює добре, я у режимі налагодження перевірив всі змінні, ніхто "не нуль", і в кінці виводяться дані - в message box)
#include <windows.h>
const int nSize = 0x4000000;//Розмір масиву даних в байтах = 64 Мбайт
/*Головна функція WinMain*/
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
/*Створення в пам'яті об'єкта «проекція файлу» для 16 М цілих чисел*/
wchar_t szMapName[] = L"myMapping";//Довільне ім'я проекції
HANDLE hMem = CreateFileMapping((HANDLE)-1, nullptr, PAGE_READWRITE, 0, nSize, szMapName);
/*Відображення виділеної фізичної пам'яті на віртуальні адреси додатки*/
int *ptr = (PINT)MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, nSize);
for(int i = 0; i < nSize / 4; i++)//Створимо тестові дані
ptr[i] = i;
/*3апустим дочірній процес*/
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
CreateProcessW(L"тут шлях до програми.exe", nullptr, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
/*Виведемо вікно повідомлення і тим самим призупинимо програму*/
wchar_t szTxt[80];
wsprintfW(
szTxt,
L"Елементи з початку,\nсередини і кінця:\n0х%x\n0х%x\n0х%x",
ptr[0],
ptr[nSize / 8],
ptr[nSize / 4 - 1]
);
MessageBoxW(nullptr, szTxt, L"Запис", MB_OK);
return 0;
}
ця програма має зчитати останні елементи ptr, але кидає помилку (тобто ptr = 0), я подивився по GetLastError, GetLastError кидає помилку "5"
#include <windows.h>
const int nSize = 0x4000000;//Розмір масиву даних в байтах = 64 Мбайт
/*Головна функція WinMain*/
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
wchar_t lpszName[] = L"myMapping";//Довільне ім'я проекції
/*Відкриємо вже створену проекцію і відобразимо її на адреси додатки*/
HANDLE hMem = OpenFileMappingW(PAGE_READWRITE, FALSE, lpszName);
if (hMem == nullptr) { MessageBoxW(NULL, L"ERROR\nhMem", L"Читання", MB_OK); return 0; }
int *ptr = (PINT)MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, nSize);
wchar_t lastError[100];
_itow_s(GetLastError(), lastError, 10);
if (ptr == nullptr) { MessageBoxW(NULL, lastError, L"Читання", MB_OK); return 0; }
/*Виведемо вікно повідомлення для контролю даних*/
wchar_t szTxt[80]{0};
wsprintfW(
szTxt,
L"Останні елементи:\n0x%x\n0x%x\n0x%x",
ptr[nSize / 4 - 3],
ptr[nSize / 4 - 2],
ptr[nSize / 4 - 1]
);
MessageBoxW(NULL, szTxt, L"Читання", MB_OK);
return 0;
}
Що тут не так ? Що мені виправити ?
Я поки що не розумію що таке "сторінковий файл". Я зрозумів так, що це Virtual Memory, так от, я подивився в себе, і дізнався що в мене є 1216 Мб (звичайно я її можу розширити), Оперативної пам'яті в мене 8 Гб, так що скорій всього майже вся Virtual Memory пуста.