C++ 调试 LoadImage() 和跳过断点

Posted

技术标签:

【中文标题】C++ 调试 LoadImage() 和跳过断点【英文标题】:C++ Debugging LoadImage() and Skipping Breakpoints 【发布时间】:2016-03-04 23:13:18 【问题描述】:

我试图找出为什么我无法从资源中加载图像。

图像在 lpszName 是文件名时有效,当更改为资源时则无效。

图像的创建方式相同(可以互换,同样的问题)

图像位于 Resource 和 Resource.rc 文件中。

代码:

LRESULT CALLBACK WndProc(HWND hWinMain, UINT message, WPARAM wParam, LPARAM lParam)

    DWORD
        lastError;
    static HDC
        hdcFromResource,
        hdcFromFilename;
    HBITMAP
        hFromResource,
        hFromResourcePrevious,
        hFromFilename,
        hFromFilenamePrevious;
    HDC 
        hdc;
    PAINTSTRUCT ps;
    switch (message)
    
    case WM_CREATE:
        hdc = GetDC(hWinMain);
        hdcFromFilename = CreateCompatibleDC(hdc);
        hdcFromResource = CreateCompatibleDC(hdc);
        ReleaseDC(hWinMain, hdc);
        hFromFilename = (HBITMAP)LoadImageW(NULL, (L"filename.bmp"), IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE);
        if (!hFromFilename)
        
            // ERROR HANDELING
        
        hFromFilenamePrevious = (HBITMAP)SelectObject(hdcFromFilename, hFromFilename);
        DeleteObject(hFromFilename);
        DeleteObject(hFromFilenamePrevious);
        hFromResource = (HBITMAP)LoadImageW(NULL, MAKEINTRESOURCEW(IDB_RESOURCE), IMAGE_BITMAP, 100, 100, LR_CREATEDIBSECTION | LR_LOADFROMFILE);   
        lastError = GetLastError();
        lastError;
        hFromResourcePrevious = (HBITMAP)SelectObject(hdcFromResource, hFromResource);
        DeleteObject(hFromResource);
        DeleteObject(hFromResourcePrevious);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWinMain, &ps);
        BitBlt(hdc, 0, 0, 100, 100, hdcFromFilename, 0, 0, SRCCOPY);
        BitBlt(hdc, 100, 100, 100, 100, hdcFromResource, 0, 0, SRCCOPY);
        EndPaint(hWinMain, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    
    return DefWindowProc(hWinMain, message, wParam, lParam);

无论图片是否加载,都不会触发if(!hFromFilename)

图片加载失败后的断点均无中断(通过WM_CREATE的断点,其他函数中的其他断点正常工作)

我不确定如何在没有断点的情况下轻松读取 GetLastError。

资源.h #define IDB_RESOURCE 101

资源.rc #define IDB_RESOURCE BITMAP DISCARDABLE "resource.bmp"

【问题讨论】:

LoadImageW(NULL, MAKEINTRESOURCEW(IDB_RESOURCE), IMAGE_BITMAP, 100, 100, LR_CREATEDIBSECTION | LR_LOADFROMFILE); LR_LOADFROMFILE 是独立的图片文件,不是嵌入的资源,所以这个需要去掉。对于您自己的资源,hInst 不应为 NULL -- 如果这些资源在您的 exe 中,请通过调用 GetModuleHandle(NULL) 获取 hInst @HansPassant IDB_RESOURCE 是“resource.bmp”,“filename.bmp”没有资源 ID。 【参考方案1】:

Christopher Oicles 回答的问题是不需要 LR_LOADFROMFILE。

可能对其他人有用:

从文件名加载图像(使用 LoadImage())示例:
LoadImage(
NULL,                           // NULL for load image via filename
L("directory\\filename.bmp"),   // String to filename
IMAGE_BITMAP                    // Flag for loading bitmap
0,                              // 0 Should use the images actual width
0,                              // 0 Should use the images actual height
LR_LOADFROMFILE                 // Flag for loading from file
);
从资源加载图像(使用 LoadImage())示例:
LoadImage(
hInstance,                      // hInstance to the file containing the resource
MAKEINTRESOURCE(IDB_RESOURCE),  // Resource definition
IMAGE_BITMAP                    // Flag for loading bitmap
0,                              // 0 Should use the images actual width
0,                              // 0 Should use the images actual height
LR_CREATEDIBSECTION             // Do not use LR_LOADFROMFILE if it is a resource
);

资源文件.h

#define IDB_RESOURCE 101                         // Resource ID, and number

资源脚本.rc

#include "Resourcefile.h"
IDB_RESOURCE BITMAP "directory\\filename.bmp"    // Resource ID, type, and filename

谢谢。

【讨论】:

以上是关于C++ 调试 LoadImage() 和跳过断点的主要内容,如果未能解决你的问题,请参考以下文章

JAVA程序调试

为啥 IntelliJ 在远程调试时跳过断点

IntelliJ IDEA 调试器在调试 Maven 测试时跳过断点

转: windbg-跳过初始断点(调试技巧)

java基础(五章)

调试 ASP.Net 应用程序 - 跳过未命中的行和断点