无法在 Visual C++ 中检索资源文件数据
Can't retrieve Resource File data in Visual C++
我正在尝试将一个 .bmp 文件嵌入到我的应用程序(一个简单的控制台应用程序)中,检索该文件的内容,然后将其写入磁盘上的另一个 .bmp 文件,看看我是否可以成功阅读我的资源。
该项目创建于 Visual Studio 2017 年:
main.cpp :
#include "stdafx.h"
#include "resource.h"
#include <Windows.h>
#include <string>
#include <iostream>
int main()
{
HRSRC hresinfo = FindResource(NULL, MAKEINTRESOURCE(IDB_BITMAP1), _T("BITMAP"));
HGLOBAL hRes = LoadResource(NULL, hresinfo);
LPVOID data = LockResource(hRes);
DWORD datasize = SizeofResource(NULL, hresinfo);
std::cout << datasize;
ofstream output("test.bmp", std::ios::binary);
output << data;
output.close();
return 0;
}
resource.h:
//{{NO_DEPENDENCIES}}
// Include file Microsoft Visual C++.
// Used by Resource.rc
//
#define IDB_BITMAP1 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
Resource.rc(有趣的部分):
IDB_BITMAP1 BITMAP "bitmap1.bmp"
整个Resource.rc
:https://pastebin.com/tnRyg64b
但是,cout
returns 0 和 test.bmp
是无效文件。我想问题是我在检索我的资源内容时遗漏了一些东西,但是在哪里?
编辑:
使用 output.write(data,datasize)
而不是 output <<
给我一个 0 Ko test.bmp (而不是 1Ko)
按照之前的建议使用 RT_BITMAP
。但是从 LockResource
返回的 data
不是可识别的位图文件,它缺少位图文件头。
您可以按如下方式制作自己的页眉:
HRSRC hresinfo = FindResource(NULL, MAKEINTRESOURCE(IDB_BITMAP1), RT_BITMAP);
if(hresinfo)
{
HGLOBAL hRes = LoadResource(NULL, hresinfo);
LPVOID data = LockResource(hRes);
DWORD datasize = SizeofResource(NULL, hresinfo);
ofstream output("test.bmp", std::ios::binary);
BITMAPFILEHEADER bfh = { 'MB', 54 + datasize, 0, 0, 54 };
output.write((char*)&bfh, sizeof(bfh));
output.write((char*)data, datasize);
output.close();
}
我正在尝试将一个 .bmp 文件嵌入到我的应用程序(一个简单的控制台应用程序)中,检索该文件的内容,然后将其写入磁盘上的另一个 .bmp 文件,看看我是否可以成功阅读我的资源。 该项目创建于 Visual Studio 2017 年:
main.cpp :
#include "stdafx.h"
#include "resource.h"
#include <Windows.h>
#include <string>
#include <iostream>
int main()
{
HRSRC hresinfo = FindResource(NULL, MAKEINTRESOURCE(IDB_BITMAP1), _T("BITMAP"));
HGLOBAL hRes = LoadResource(NULL, hresinfo);
LPVOID data = LockResource(hRes);
DWORD datasize = SizeofResource(NULL, hresinfo);
std::cout << datasize;
ofstream output("test.bmp", std::ios::binary);
output << data;
output.close();
return 0;
}
resource.h:
//{{NO_DEPENDENCIES}}
// Include file Microsoft Visual C++.
// Used by Resource.rc
//
#define IDB_BITMAP1 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
Resource.rc(有趣的部分):
IDB_BITMAP1 BITMAP "bitmap1.bmp"
整个Resource.rc
:https://pastebin.com/tnRyg64b
但是,cout
returns 0 和 test.bmp
是无效文件。我想问题是我在检索我的资源内容时遗漏了一些东西,但是在哪里?
编辑:
使用 output.write(data,datasize)
而不是 output <<
给我一个 0 Ko test.bmp (而不是 1Ko)
按照之前的建议使用 RT_BITMAP
。但是从 LockResource
返回的 data
不是可识别的位图文件,它缺少位图文件头。
您可以按如下方式制作自己的页眉:
HRSRC hresinfo = FindResource(NULL, MAKEINTRESOURCE(IDB_BITMAP1), RT_BITMAP);
if(hresinfo)
{
HGLOBAL hRes = LoadResource(NULL, hresinfo);
LPVOID data = LockResource(hRes);
DWORD datasize = SizeofResource(NULL, hresinfo);
ofstream output("test.bmp", std::ios::binary);
BITMAPFILEHEADER bfh = { 'MB', 54 + datasize, 0, 0, 54 };
output.write((char*)&bfh, sizeof(bfh));
output.write((char*)data, datasize);
output.close();
}