Не удается получить данные файла ресурсов в Visual C ++ - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь встроить файл .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 возвращает 0, а test.bmp - неверный файл. Думаю, проблема в том, что я что-то упустил при получении содержимого моего ресурса, но где?

EDIT: Использование output.write(data,datasize) вместо output << дает мне 0 Ko test.bmp (вместо 1Ko)

1 Ответ

0 голосов
/ 27 июня 2018

Используйте RT_BITMAP, как предлагалось ранее. Но data, возвращаемый из LockResource, не является распознаваемым растровым файлом, в нем отсутствует заголовок растрового файла.

Вы можете сделать свой собственный заголовок следующим образом:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...