1> hBufferObject = CreateFileMapping(
(HANDLE)0xFFFFFFFF,
NULL,
PAGE_READWRITE,
0,
size//图像数据大小,
NULL);
2>lpvBuffer = MapViewOfFile(hBufferObject, FILE_MAP_ALL_ACCESS, 0, lBufferOffset, size);
3>hbmInput = CreateDIBSection(
hdcCompatInput,
(LPBITMAPINFO)vSrc->getDecompressedFormat(),
DIB_RGB_COLORS,
&lpvInput,
hBufferObject,//内存映射文件句柄
0
)
是不是CreateDIBSection时,如果指定了文件映射对象就不用另外开缓冲区了?如果该方法还另外还缓冲区,那要文件映射对象干什么,但问题是MapViewOfFile返回的指针和CreateDIBSection返回的指针不一样,那么究竟指向图像数据的指针是哪一个,怎么样通过内存文件映射对象把图像数据拷到hdcCompatInput的缓冲区中去再通过BITBLT显示。

解决方案 »

  1.   

    you'd better to use the handle to control the core object.
      

  2.   

    虽然 MapViewOfFile 和 CreateDIBSection 返回的指针不一样, 但这并不代表 CreateDIBSection 重新分配了内存. 你可以试试连结两次 MapViewOfFile, 两次参数一模一样, 你会看到返回的地址也不一样的.windows 虽然两次映射到不同的地址空间, 但数据还是相关的, 只要从同一个文件映射对象中映射视图至于 "怎么样拷到....缓冲区"给个例子:void main()
    {
    int size = 200 * 200 * 32;
    HANDLE hMap
    = CreateFileMapping(
    INVALID_HANDLE_VALUE,
    NULL,
    PAGE_READWRITE,
    0,
    size,//图像数据大小,
    NULL);// LPVOID pBuffer = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    HDC hdc = GetWindowDC(NULL); LPVOID pbits = NULL;
    BITMAPINFO bi;
    memset(&bi, 0, sizeof(bi)); bi.bmiHeader.biBitCount = 32;
    bi.bmiHeader.biClrImportant = 0;
    bi.bmiHeader.biClrUsed = 0;
    bi.bmiHeader.biCompression = 0;
    bi.bmiHeader.biHeight = 200;
    bi.bmiHeader.biPlanes = 1;
    bi.bmiHeader.biSize = sizeof(bi);
    bi.bmiHeader.biSizeImage = 0;
    bi.bmiHeader.biWidth = 200;
    bi.bmiHeader.biXPelsPerMeter= 0;
    bi.bmiHeader.biYPelsPerMeter= 0; HBITMAP hbm = CreateDIBSection(
    hdc,
    &bi,
    DIB_RGB_COLORS,
    &pbits,
    hMap,//内存映射文件句柄
    0
    ); HDC hCompDC = CreateCompatibleDC(hdc);
    SelectObject(hCompDC, hbm); // 这句完成后, 屏幕左上角会有一块黑色的色块 :)
    // 不过可能会很块残缺以至没有了
    BitBlt(hdc, 0, 0, 200, 200, hCompDC, 0, 0,SRCCOPY);
    DeleteObject(hbm);
    ReleaseDC(NULL, hdc);
    DeleteDC(hCompDC);
    CloseHandle(hMap);
    // UnmapViewOfFile(pBuffer);}