Win32 LoadBitmap返回错误1814

时间:2015-10-01 06:36:31

标签: c++ winapi

我一直试图让LoadBitmap()工作一段时间。它返回错误1814,ERROR_RESOURCE_NAME_NOT_FOUND。代码如下,但到目前为止我已尝试过:

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

我也经历过我能找到的每一个问题,其他网站,MSDN文档,并尝试应用我在那里找到的东西,但无济于事。我错过了什么?

在Eclipse上使用MinGW

RESOURCE.RC

#include "resource.h"

IDBMP_TREEICON BITMAP "icon.bmp"

RESOURCE.H

#ifndef __RESOURCE_H_INCLUDED__
#define __RESOURCE_H_INCLUDED__

#define IDBMP_TREEICON 101

#endif

的main.cpp

#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;
}

1 个答案:

答案 0 :(得分:4)

LoadBitmapERROR_RESOURCE_NAME_NOT_FOUND失败时,这意味着您指定的模块没有类型RT_BITMAP的资源,其中包含您提供的资源ID。这绝对是那么简单。

有许多可能的失败模式:

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

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

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

另外,MAKEINTRESOURCE是一个简单的宏,期望GetLastError()返回与MAKEINTRESOURCE相关的任何内容都是错误的。作为一项严格的规则,只有在文档明确说明这样做有意义时才使用GetLastError()