代码之家  ›  专栏  ›  技术社区  ›  EinderJam

无法在Visual C++中检索资源文件数据

  •  0
  • EinderJam  · 技术社区  · 8 年前

    该项目由Visual Studio 2017创建:

    #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;
    }
    

    资源.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
    

    IDB_BITMAP1             BITMAP                  "bitmap1.bmp"
    

    Resource.rc 以下内容: https://pastebin.com/tnRyg64b

    cout test.bmp

    使用 output.write(data,datasize) output <<

    1 回复  |  直到 8 年前
        1
  •  0
  •   Barmak Shemirani    8 年前

    使用 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();
    }