q_q Нет в 98 всё совсем неадекватно - виртуальные файлы >2Гб в памяти нормально создаются )) но вот работать затем с ними не получается (можно только если виртуальный файл один и совсем маленький - типа метров 500-1000). А в ХР - "адекватно" - т.е. ошибка возникает сразу в CreateFileMapping, проверь - может у тебя полчится? (отличие от твоего примера - виртуальность, т.е. адресное пространство без размещения на диске реального файла с таким же размером)
Y_Mur отличие от твоего примера - виртуальность, т.е. адресное пространство без размещения на диске реального файла Цитата MSDN CreateFileMapping: " If hFile is INVALID_HANDLE_VALUE, the calling process must also specify a size for the file mapping object in the dwMaximumSizeHigh and dwMaximumSizeLow parameters. In this scenario, CreateFileMapping creates a file mapping object of a specified size that is backed by the system paging file instead of by a file in the file system." Если я правильно понимаю, то, использование CreateFileMapping с параметром INVALID_HANDLE_VALUE приводит к тому, что память будет зарезервирована в файле подкачки, т.е. используется "реальный файл". Afaik 32-ух разрядная система не нуждается более чем в 4 гигабайтном файле подкачки. проверь - может у тебя полчится Проверить что? Ты даешь ссылку на _обрывок_ кода - я не понимаю его смысл. Пишешь, что возникают ошибки, и при этом не конкретизируешь какие именно. + До сих пор не встречал, что можно использовать связку CreateFileMapping -> MapViewOfFile -> VirtualAlloc. Не понимаю, зачем использовать VirtualAlloc, ведь MapViewOfFile создает доступный регион физической памяти. Если вернуться к вопросу работопригодности dwMaximumSizeHigh, то Код (Text): #define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <tchar.h> #include <stdio.h> static DWORD WINAPI GetPageSize(void) { SYSTEM_INFO si; GetSystemInfo(&si); return si.dwAllocationGranularity; } static void WINAPI foo(HANDLE hFileMap, ULARGE_INTEGER ulFileSize) { ULARGE_INTEGER ulMapOffset; LPVOID pBuffer; SIZE_T MapSize; SIZE_T DefMapSize = GetPageSize(); ulMapOffset.QuadPart = 0; while (0 != ulFileSize.QuadPart) { MapSize = (SIZE_T) min(DefMapSize, ulFileSize.QuadPart); pBuffer = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, ulMapOffset.HighPart, ulMapOffset.LowPart, MapSize); if (NULL == pBuffer) { _tprintf(TEXT("MapViewOfFile(0x%08X%08X) failed 0x%08X"), ulMapOffset.HighPart, ulMapOffset.LowPart, GetLastError()); return; } ulFileSize.QuadPart -= MapSize; ulMapOffset.QuadPart += MapSize; // TODO RtlFillMemory(pBuffer, MapSize, 1); UnmapViewOfFile(pBuffer); } } void main(void) { ULARGE_INTEGER ulSize; HANDLE hFile, hFileMap; // 5Gb ulSize.HighPart = 1; ulSize.LowPart = 1024*1024*1024; hFile = CreateFile(TEXT("C:\\MMFTest.dat"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) _tprintf(TEXT("CreateFile failed 0x%08X"), GetLastError()); else { hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, ulSize.HighPart, ulSize.LowPart, NULL); if (NULL == hFileMap) _tprintf(TEXT("CreateFileMapping failed 0x%08X"), GetLastError()); else { foo(hFileMap, ulSize); CloseHandle(hFileMap); } CloseHandle(hFile); } } демонстрирует, что, например, на wxpsp2pro + ntfs, можно теоретически иметь _собственную_ виртуальную память размером до (2^64 - 1).
MSoft и тебе тоже )) (вот только отдать врятли смогу, я уверен что мы очень далеко друг от друга) q_q – зачем нужны такие объемы виртуальной памяти, не лучше ли сразу работать с файлами.
Perre зачем нужны такие объемы виртуальной памяти Круг здачь, решаемых на компьютере, не ограничивается хелловорлд'ами, лабораторными/курсовыми, соревнованием "гуров" - чей код меньше и т.п. не лучше ли сразу работать с файлами mmf, по мимо прочего, - обертка вокруг file i/o.