WinAPI を使用して作成したプログラムがあります。プログラム内にビットマップをリソースとして埋め込むと、プログラムはそのリソースを読み込み、bitblt を介して背景画像として表示します。
以下に、WinAPI プログラムの背景を置き換えるコンソール プログラムを作成しました。ビットマップは正常に置き換えられますが、WinAPI プログラムは背景を表示しなくなりました。ResourceHacker を使用すると、リソースをクリックして問題なく表示できるため、置換が機能したことはわかっています。
このスクリーンショットは、正常に置き換えられたことを示しています。
ただし、ResourceHacker を使用して画像をディスクに保存すると、画像をプレビューしたり、エディターで開いたりすることができません。
WinAPI プログラム内で resourcehacker を使用して画像を置き換えると、問題なく動作し、プログラムはそれを背景として表示します。
以上のことを踏まえて、私が以下で間違ったことを誰か説明できますか?
//In my resource file of the WINAPI PROGRAM:
//IDI_ICON ICON "Resources/Icon.ico"
//IDB_BACKGROUND BITMAP DISCARDABLE "Resources/BackgroundImg.bmp"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
bool Update(int ResourceID, std::string ModulePath, string FilePath)
{
HANDLE hResource = BeginUpdateResource(ModulePath.c_str(), false);
if (hResource != nullptr)
{
std::fstream File(FilePath.c_str(), std::ios::in | std::ios::binary);
if (File.is_open())
{
File.seekg(0, std::ios::end);
std::size_t FileSize = File.tellg();
File.seekg(0, std::ios::beg);
std::vector<std::uint8_t> Data(FileSize); //Also used a pointer.. makes no difference..
File.read(reinterpret_cast<char*>(Data.data()), FileSize);
File.close();
if (UpdateResource(hResource, RT_BITMAP, MAKEINTRESOURCE(ResourceID), MAKELANGID(0x0409, 0x1), Data.data(), FileSize))
{
EndUpdateResource(hResource, false);
return true;
}
}
}
return false;
}
int main()
{
if (Update(1001, "Module.exe", "Resources/BackgroundImg.bmp"))
{
std::cout<<"Updated Successfully";
}
else
{
std::cout<<"Failed To Update";
}
return 0;
}