Win32 LoadBitmap 返回错误 1814

0 c++ winapi

LoadBitmap()一段时间以来我一直在努力上班。它返回错误 1814 ERROR_RESOURCE_NAME_NOT_FOUND,。下面的代码,但到目前为止我已经尝试过:

  • 使用(HBITMAP)LoadImage()代替LoadBitmap()
  • 使用MAKEINTRESOURCE('ICON.BMP')而不是资源标识符
  • 更改位图的文件名、资源标识符名称和资源类型,以及尝试使用完整路径名或仅使用文件名
  • 使用GetModuleHandle(NULL)而不是将实例句柄传递给函数
  • 将其分离MAKEINTRESOURCE并放在自己的错误检查后面只是为了确保问题不存在(它不存在)
  • 检查编译器和链接器的更新
  • 单步执行调试器

我还浏览了我能找到的关于此问题、其他网站、MSDN 文档的每个 SO 问题,并尝试应用我在那里找到的内容,但无济于事。我缺少什么?

在 Eclipse 上使用 MinGW

资源文件

#include "resource.h"

IDBMP_TREEICON BITMAP "icon.bmp"
Run Code Online (Sandbox Code Playgroud)

资源.h

#ifndef __RESOURCE_H_INCLUDED__
#define __RESOURCE_H_INCLUDED__

#define IDBMP_TREEICON 101

#endif
Run Code Online (Sandbox Code Playgroud)

主程序

#include <windows.h>
#include <stdio.h>
#include <commctrl.h>
#include <string>
#include "resource.h"

BOOL InitTreeViewImage(HINSTANCE hInstance, HWND hWnd){
    HBITMAP hbmp = NULL;
    HIMAGELIST hImgList;

    if((hImgList = ImageList_Create(10, 10, FALSE, 1, 0)) == NULL){
        MessageBox(NULL, "Failed to create ImageList!", "Eror", MB_OK);
        return false;
    }

    LPCSTR theBitmap = NULL;
    theBitmap = MAKEINTRESOURCE(IDBMP_TREEICON);
    if(theBitmap == NULL){
        //GetLastError(), output to console, messagebox - removed for brevity in this example
        return false;
    }

    hbmp = LoadBitmap(hInstance, theBitmap);
    if(hbmp == NULL){
        //GetLastError(), output to console, messagebox - removed for brevity in this example
        return false;
    }
    treeIcon = ImageList_Add(hImgList, hbmp, NULL);
    if(treeIcon == 1){
        MessageBox(NULL, "Failed to add icon to image list!", "Eror", MB_OK);
        return false;
    }
    DeleteObject(hbmp);

    TreeView_SetImageList(hWnd, hImgList, TVSIL_NORMAL);

    return true;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

如果LoadBitmap失败并显示ERROR_RESOURCE_NAME_NOT_FOUND,则意味着您指定的模块没有具有RT_BITMAP您提供的资源 ID 类型的资源。绝对就是这么简单。

有多种可能的故障模式:

  • 您提供了错误的模块。检查是否hInstance确实识别了您将资源链接到的正确模块。

  • 您链接的资源类型错误或 ID 错误。鉴于您在问题中提出的内容,这似乎不太可能。

  • 您未能将编译的资源文件传递给链接器,并且没有资源实际链接到可执行文件。

顺便说一句,是一个简单的宏,期望返回与 相关的任何内容MAKEINTRESOURCE是错误的。作为一条硬性规则,只有在文档明确说明这样做有意义时才使用。GetLastError()MAKEINTRESOURCEGetLastError()