WIN API C ++写入文件的本地位图资源不可见

时间:2014-04-25 18:34:15

标签: c++ api resources bmp

我试图将Visual Studio C ++中导入的本地资源(.BMP)写入文件。我已经为资源添加了新的资源类型BITMAP。它的ID是101(显示在resource.h中)。我可以成功找到它并将其保存到文件中,但保存的文件不再是BMP,它与原始文件大小相同。我在十六进制编辑中看到"标题"书面文件与我导入项目的原始BMP不同。 这是代码,请帮忙谢谢!

`

   WORD wResId = 101;
    LPSTR lpszOutputPath = "c:\\test.bmp";
    HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , RT_BITMAP);
    HGLOBAL hLoaded = LoadResource(NULL,hrsrc);
    LPVOID lpLock =  LockResource(hLoaded);
    DWORD dwSize = SizeofResource(NULL, hrsrc);
    HANDLE hFile = CreateFile (lpszOutputPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    DWORD dwByteWritten;
    WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL);
    CloseHandle(hFile);
    FreeResource(hLoaded);`

1 个答案:

答案 0 :(得分:1)

RT_BITMAP资源中没有BITMAPFILEHEADER,因此如果要将其保存到磁盘,则需要添加该资源。您可以将资源存储为RT_RCDATA以完全嵌入磁盘上的文件,但是您将无法使用LoadImage之类的函数来读取它。

这应该做你需要的:

#include <Windows.h>

int main()
{
    WORD wResId = 101;
    LPSTR lpszOutputPath = "test.bmp";
    HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , RT_BITMAP);
    HGLOBAL hLoaded = LoadResource(NULL,hrsrc);
    LPVOID lpLock =  LockResource(hLoaded);
    DWORD dwSize = SizeofResource(NULL, hrsrc);
    HANDLE hFile = CreateFile (lpszOutputPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    DWORD dwByteWritten;

    //Write BITMAPFILEHEADER
    BITMAPFILEHEADER bfh;
    bfh.bfType = 0x4d42;
    bfh.bfSize = dwSize + sizeof(BITMAPFILEHEADER);
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bfh.bfReserved1 = bfh.bfReserved2 = 0;
    WriteFile(hFile, &bfh, sizeof(bfh), &dwByteWritten , NULL);

    WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL);
    CloseHandle(hFile);
    FreeResource(hLoaded);
    return 0;
}