gpt4 book ai didi

c++ - 替换exe中的位图资源

转载 作者:搜寻专家 更新时间:2023-10-31 00:16:47 25 4
gpt4 key购买 nike

我有一个使用 WinAPI 创建的程序。在程序中,我将位图作为资源嵌入,程序加载该资源并通过 bitblt 将其显示为背景图像。

下面,我创建了一个控制台程序来替换WinAPI程序中的后台。它成功地替换了位图,但现在 WinAPI 程序不再显示背景。我知道替换工作有效,因为使用 ResourceHacker,我可以单击该资源并正常显示。

这个截图说明替换成功了: enter image description here

但是,如果我使用 ResourceHacker 将图像保存回磁盘,则无法使用任何编辑器预览或打开图像:

enter image description here

如果我在 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;
}

最佳答案

啊啊啊!我解决了!仅供任何阅读者阅读,这就是答案。这是一篇关于 Microsoft 支持的旧知识库文章:http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b67883

如果你不明白:

它说文件中的位图和作为资源存储的位图之间的唯一区别是一个是 DIB,另一个是打包的 DIB。这两者之间的区别在于一个有 BITMAPFILEHEADER 而另一个没有。资源在没有 FileHeaders 的情况下存储,因此必须将其删除。

因此,当更新位图资源时,您必须删除 BitmapFileHeader(注意下面的 SizeOf 偏移量):

bool UpdateBitmap(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);
File.read(reinterpret_cast<char*>(Data.data()), FileSize);
File.close();

if (UpdateResource(hResource, RT_BITMAP, MAKEINTRESOURCE(ResourceID), MAKELANGID(0x0409, 0x1), Data.data() + sizeof(BITMAPFILEHEADER), FileSize - sizeof(BITMAPFILEHEADER))) //Notice the sizeof.
{
EndUpdateResource(hResource, false);
return true;
}
}
}
return false;
}

此代码与 OP 中的代码之间的唯一区别是偏移量为 sizeof(BITMAPFILEHEADER)。

关于c++ - 替换exe中的位图资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15171624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com