我遇到了一个内存问题我使用的算法“拼合”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
问题是我有一个非常大的位图,在某些情况下,当我分配要复制的DIB时,我无法将HBitmap保留在内存中。
所以这是一个很长的镜头,但是我可以以某种方式在磁盘上分配Dib部分并且仍然有一个HBITMAP吗? (对我的ConvertBitmap函数使用相同的句柄)
答案 0 :(得分:1)
什么是失败模式?你说“物理内存”:windows使用虚拟内存,它会分页到磁盘,你不必担心物理内存耗尽超出性能命中。如果您的地址空间不足,使用该磁盘可能无法帮助您。
但是,CreateDIBSection
可以将HANDLE
带到文件映射(使用CreateFileMapping
创建)。如果函数内部和相关的HBITMAP函数足够智能,则可以通过利用该功能来避免耗尽地址空间。如果他们“聪明”,他们将使用MapViewOfFile
将文件中相对较小的“窗口”映射到您的流程的地址空间。