我在VS2012中使用SFML和C ++。我的程序有很多图像,但我试图从资源加载其中一些。我已经在projectname.rc中成功实现了该文件,一切看起来都很好,但是当我试图加载图像时它会产生异常,它说:“无法从内存中加载图像,没有提供数据”(这是来自sfml)。
这是我的main.cpp:
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <windows.h>
#include "resource.h"
sf::Image LoadImageFromResource(const std::string& name)
{
HRSRC rsrcData = FindResource(NULL, name.c_str(), RT_RCDATA);
if (!rsrcData)
throw std::runtime_error("Failed to find resource.");
DWORD rsrcDataSize = SizeofResource(NULL, rsrcData);
if (rsrcDataSize <= 0)
throw std::runtime_error("Size of resource is 0.");
HGLOBAL grsrcData = LoadResource(NULL, rsrcData);
if (!grsrcData)
throw std::runtime_error("Failed to load resource.");
LPVOID firstByte = LockResource(grsrcData);
if (!firstByte)
throw std::runtime_error("Failed to lock resource.");
sf::Image image;
if (!image.loadFromMemory(firstByte, rsrcDataSize))
throw std::runtime_error("Failed to load image from memory.");
return image;
}
int main()
{
sf::Image resource = LoadImageFromResource("IDB_BITMAP1");
// (...)
}
这是我的(projectname.rc)资源文件:
#include "resource.h"
#include "afxres.h"
//(. . .)
IDB_BITMAP1 BITMAP "C:\\ (...) \\sprite.bmp"
从我的resource.h:
#define IDB_BITMAP1 107
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 108
#define _APS_NEXT_COMMAND_VALUE 40003
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
答案 0 :(得分:1)
问题是我在HRSRC要求RT_RCDATA类型,并且正在尝试传递BITMAP资源类型。我改变了
IDB_BITMAP1 BITMAP "C:\\ (...) \\sprite.bmp"
为:
IDB_BITMAP1 RCDATA "C:\\ (...) \\sprite.bmp"`
现在工作正常。