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() 和跳过断点的主要内容,如果未能解决你的问题,请参考以下文章