Windows для профессионалов


Особенности проецирования файлов на разных платформах - часть 3


if ((pbFile + 65536) == pbFilft2))
{

// если адреса перекрываются, оба предсгавления проецируются на один
// регион, и мы работаем в Windows 98
MessageBox(NULL, "We are running under Windows 98", NULL, MB_OK);

}
else
{

// если адреса не перекрываются, каждое представление размещается в
// своем регионе адресного пространства, и мы работаем в Windows 2000
MessageBox(NULL, "We are running under Windows 2000", NULL, MB_OK),

}

UnmapViewOfFile(pbFile2);
UnmapViewOfFile(pbFile);
CloseHandle(hFileMapping);
CloseHandle(hFile};

return(0);

}

Когда приложение в Windows 98 отображает на адресное пространство представ ление объекта "проекция файла", ему отводится регион, достаточно большой для раз мещения всего объекта Это происходит, даже если Вы просите MapViewOfFile спрое цировать лишь малую часть такого объекта. Поэтому спроецировать объект размером 1 Гб не удастся, даже если указать, что представление должно быть не более 64 Кб.

При вызове каким-либо процессом функции MapViewOfFile ему возвращается ад рес в пределах региона, зарезервированного для целого объекта "проекция файла". Так что в покязанной выше программе первый вызов этой функции дает базовый адрес региона, содержащего весь спроецированный файл, а второй — адрес, смещенный "вглубь" того же региона на 64 Кб.

Wmdows 2000 и здесь ведет себя совершенно иначе Два вызова функции МарView OfFile (как в показанном выше коде) приведут к тому, что будут зарезервированы два

региона адресного пространства. Объем первого будет равен размеру объекта "про екция файла", объем второго — размеру объекта минус 64 Кб. Хотя регионы - раз ные, система гарантирует когерентность данных, так как оба представления созданы на основе одного объекта "проекция файла" А в Windows 98 такие представления когерентны потому, что они расположены в одном участке памяти




Начало  Назад  Вперед