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

C++ WIN API C++;写入文件的本地位图资源不可查看,c++,api,resources,bmp,C++,Api,Resources,Bmp,我试图在VisualStudioC++中编写一个本地资源(.bmp)到文件。我已将新的资源类型位图添加到资源中。它的ID是101(如资源.h所示)。我可以成功地找到它并将其保存到文件中,但保存的文件不再是BMP,它的大小与原始文件相同。我在hex editor中看到,写入文件的“头”与我导入到项目中的原始BMP不同。 这是代码,请帮忙谢谢 ` RT\u位图资源中没有BITMAPFILEHEADER,因此如果要将其保存到磁盘,需要添加该文件。您可以将资源存储为RT\u RCDATA以完全按照文件在

我试图在VisualStudioC++中编写一个本地资源(.bmp)到文件。我已将新的资源类型位图添加到资源中。它的ID是101(如资源.h所示)。我可以成功地找到它并将其保存到文件中,但保存的文件不再是BMP,它的大小与原始文件相同。我在hex editor中看到,写入文件的“头”与我导入到项目中的原始BMP不同。 这是代码,请帮忙谢谢

`


RT\u位图
资源中没有
BITMAPFILEHEADER
,因此如果要将其保存到磁盘,需要添加该文件。您可以将资源存储为
RT\u 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;
}
#包括
int main()
{
单词wResId=101;
LPSTR lpszOutputPath=“test.bmp”;
HRSRC HRSRC=FindResource(NULL,MAKEINTRESOURCE(wResId),RT\u位图);
HGLOBAL hLoaded=LoadResource(NULL,hrsrc);
LPVOID lpLock=锁资源(已加载);
DWORD dwSize=SizeofResource(NULL,hrsrc);
HANDLE hFile=CreateFile(lpszOutputPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
德沃德·德比泰克;
//写入BITMAPFILEHEADER
位图文件头;
bfh.bfType=0x4d42;
bfh.bfSize=dwSize+sizeof(BITMAPFILEHEADER);
bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BitMapInfo Header);
bfh.bfReserved1=bfh.bfReserved2=0;
WriteFile(hFile,&bfh,sizeof(bfh),&dwbytewrited,NULL);
WriteFile(hFile、lpLock、dwSize和dwbytewrited,NULL);
闭合手柄(hFile);
免费资源(已加载);
返回0;
}
#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;
}