1 Востаннє редагувалося Betterthanyou (14.04.2017 20:50:49)

Тема: Обмін даними через сторінковий файл

Вивчаю по "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 пуста.

2

Re: Обмін даними через сторінковий файл

Для початку - дайте повну назву тієї ідіотської книжки, де відображення файлу на пам'ять зветься "сторінковим файлом", з автором і датою видання, як попередження іншим. Після чого викиньте і візьміть щось нормальне.

3

Re: Обмін даними через сторінковий файл

К Г ФИНОГЕНОВ win32 основы программирования 2006.
"Глава 13 Обмен информацией между процессами и потоками"
"Обмен данными через страничный файл" ст 370 - 372 Якщо я не правильно переклад (страничный файл - сторінковий файл), вибачаюся

4

Re: Обмін даними через сторінковий файл

Джеффри Рихтер ДЛЯ ПРОФЕССИОНАЛОВ WINDOWS Создание эффективных Win32-приложений
с учетом специфики 64-разрядной версии Windows ИЗДАНИЕ ЧЕТВЕРТОЕ. 2008
Физическая память и страничный файл cт - 320

5

Re: Обмін даними через сторінковий файл

а можливо я просто неправильно переклав. Але все ж таки що не так з кодом, який я навів вище ? Чому ptr дорівнює 0 ?

6

Re: Обмін даними через сторінковий файл

Ви наплутали файл і його відображення (проекцію за термінологією з книжки). Ви не можете програмно створити сторінковий файл (точніше, звісно, можете, але для цього треба буде змінити кілька системних налаштувань і, цілком можливо, перезавантажити систему).
https://uk.wikipedia.org/wiki/Віртуальна_пам'ять
https://uk.wikipedia.org/wiki/Підкачка_сторінок
Взагалі я не розумію, нащо тут про сторінковий файл розповідається. Так, він використовується, але неявно. Для вас це - просто шматок пам'яті з ім'ям, по якому його можна знайти.

Що ж до помилки - то користуйтеся FormatMessage, щоб отримати текстове повідомлення з коду. 5 - це ERROR_ACCESS_DENIED. Я не бачу тут якихось проблем (ну, крім того, що ви нічого не закриваєте), треба запускати, а VS заради цього я ставити не буду, вибачте.

Подякували: Betterthanyou1