CreateDibSection на диске вместо физической памяти - PullRequest
1 голос
/ 13 января 2011

У меня проблема с памятью из-за алгоритма, который я использую для «выравнивания» страницы в документе PDF.

HBITMAP hbmp = CreateDibSection(...);
ThirdPartyBmpManipulation(hbmp, "C:\\file.pdf", 0); //renders page 0 in file.pdf
void * hdib = ConvertBitmap(hbmp); //copy a Dib Section to a Dib
DeleteObject(hbmp); //frees the HBitmap while the Dib is now in memory

Проблема в том, что у меня действительно большое растровое изображение, и в некоторых случаях я не могу сохранить HBitmap в памяти, пока выделяю DIB для копирования.

Так что это длинный путь, но могу ли я как-то выделить Dib-секцию на диске и при этом иметь HBITMAP для него? (используйте ту же ручку для моей функции ConvertBitmap)

1 Ответ

1 голос
/ 13 января 2011

Что такое режим сбоя? Вы говорите «физическая память»: Windows использует виртуальную память, она будет перелистывать страницы на диск, вам не нужно беспокоиться об исчерпании физической памяти после снижения производительности. Если у вас заканчивается адресное пространство, использование диска может вам не помочь.

Однако CreateDIBSection может принять HANDLE для сопоставления файла (созданного с помощью CreateFileMapping). Если внутренняя часть функции и связанные с ней функции HBITMAP достаточно умны, возможно, удастся избежать исчерпания вашего адресного пространства, используя эту возможность. Если они «умные», они будут использовать MapViewOfFile для сопоставления относительно маленьких «окон» файла при необходимости с адресным пространством вашего процесса.

...