我对 C++ 比较陌生(但不是整体编程),并且我在使用 Visual Studio 编译的 C++ 程序中使用 OpenGL。我想做到这一点,这样我就可以:
images/texture.png
)目标是使我的程序 100% 位于单个 .exe 中,而无需携带程序员可能希望用户无法访问或修改的各种数据文件(即图像) .
就目前而言,我的程序已经静态链接所有正在使用的库,因此编译器输出只是一个 .exe (和一个 .pdb),但该程序仍然依赖于需要访问图像文件(我必须复制到)同一目录中。再说一次,我想要一个可以在我的系统(也可能在其他系统)上的任何地方单独运行并具有程序功能的 .exe。
我听说过资源文件,它们可能是这个问题的解决方案,但我几乎没有找到任何关于它们的可用信息;我发现的所有内容都是关于 C# 或 dotnet 的,这两者都不适用于我的程序。由于我不熟悉 C++,我可能只是误解了我的研究。
我觉得我错过了一些明显的东西。有人可以帮我解惑吗?
在 Visual Studio C++ 项目中 -> 添加新项目:资源文件(.rc)。
右键单击resource.rc文件->查看代码。
在resource.rc中添加
IDB_MY_IMAGE PNG "your path\\texture.png"
在resource.h(自动创建)第一行添加
#define IDB_MY_IMAGE 10001
。 10001是自定义ID。
测试代码:
#include<Windows.h>
#include<iostream>
#include"resource.h"
int main() {
//load the resource
HMODULE hModule = GetModuleHandle(NULL);
HRSRC hResource = FindResource(hModule, MAKEINTRESOURCEW(IDB_MY_IMAGE), L"PNG");
DWORD imageSize = SizeofResource(hModule, hResource);
HGLOBAL hGlobal = LoadResource(hModule, hResource);
LPVOID imageBuffer = LockResource(hGlobal);
unsigned char* imageData = new unsigned char[imageSize];
memcpy(imageData, imageBuffer, imageSize);
/* Display the png here*/
////////////////
////////////////
UnlockResource(hGlobal);
FreeResource(hGlobal);
delete[] imageData;
return 0;
}