【发布时间】:2021-07-29 00:46:12
【问题描述】:
我正在使用 Visual Studio Community 2019 版本 16.10.4。我创建了一个显示 bmp 图片的 Win32 C++ 应用程序。我一直在尝试将图片嵌入到编译的 .exe 中,但没有成功。我的目标是创建 .exe 而不需要任何其他文件或文件夹。
我做了以下事情:
- 在解决方案资源管理器中右键单击应用名称
- 从下拉列表中选择添加,从弹出框中选择新项目
- 在左栏中选择 Resource,在右栏中选择 Resource File(.rc),然后在底部选择 Add 按钮
- 出现弹出:警告 RC4005:'_APS_NEXT_RESOURCE_VALUE':重新定义,选择确定
- 在资源视图中,右键单击 Resource.rc 并选择底部的添加资源...
- 选择位图并选择新建 还有几个步骤,但在尝试解决问题后我迷失了方向。
在资源文件下的解决方案资源管理器中,我有 Resource.rc 和 art1.bmp。对于 art1.bmp 我有它,所以它不会从构建中排除。还创建了一个 resource.h 文件。
resource.h 有以下内容:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Resource.rc
//
#define IDB_BITMAP1 103
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
在 .rc 文件中,它具有以下(以及更多)
IDB_BITMAP1 BITMAP "art1.bmp"
我在项目根目录、Release 文件夹和 Debug 文件夹中有 art1.bmp。
在我将代码编译到 Release x86 后,当我运行 .exe 时,图片显示没有任何问题(在 Debug 中也是如此)。如果我从 Release 文件夹中删除图片,图片将不再显示。
关于我遗漏了哪些步骤或我需要更改什么以使图片成为 .exe 的一部分而不是单独文件的任何建议?
【问题讨论】:
-
如何显示图片?您是否真的从资源中加载它 - 您是否在代码中的任何地方使用
IDB_BITMAP1?听起来您的代码不使用资源,而是读取磁盘上的文件。 -
@Igor Tandetnik,你是对的。我在 LoadImageA 中没有 IDB_BITMAP1(现在使用 A 而不是 W)。我添加了#include "resource.h" 并来自: bitmap = (HBITMAP)LoadImageA(NULL, "art1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);到位图 = (HBITMAP)LoadImageA(NULL, IDB_BITMAP1, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);我收到以下错误:“int”类型的错误(活动)E0167 参数与“LPCSTR”类型的参数不兼容错误 C2664 'HANDLE LoadImageA(HINSTANCE,LPCSTR,UINT,int,int,UINT)':无法转换参数 2从“int”到“LPCSTR”
-
所以我尝试了以下操作,但得到“在 DesktopApp3.exe 中的 0x776D0796 (ntdll.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000067。”位图 = (HBITMAP)LoadImageA(NULL, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);此时我正在考虑使用我的 .cpp 文件创建一个新项目并重新创建资源文件。我想我可能会因为我一直在尝试的所有更改而弄脏了一些东西。
-
当您实际上不想从文件加载时,为什么要传递
LR_LOADFROMFILE?让它LoadImage(GetModuleHandle(nullptr), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, 0) -
@Igor Tandetnik 成功!你能试着解释一下你是如何知道使用 GetModuleHandle(nullptr) 而不是 NULL 的吗?我浏览了 LoadImageA 函数文档和链接几个小时都没有成功。我还阅读了 GetModuleHandleA 函数的页面,但从未弄清楚 GetModuleHandle(nullptr)。对于 UINT,我确实尝试了 NULL,但由于我没有 GetModuleHandle(nullptr),因此该函数不起作用。现在我看到 UINT 的 NULL 实际上与 0 相同。