gpt4 book ai didi

delphi - 为什么向 exe 添加大量资源会很慢并且有时会损坏 exe?

转载 作者:行者123 更新时间:2023-12-03 19:42:11 27 4
gpt4 key购买 nike

我正在我自己的代码中尝试来自 Mad-collections(用于在 exe 中添加/删除或更新资源的单元)中 Madres 单元的不同功能。这适用于小型资源(小于 50 MB),但对于较大的资源(大于 50 MB)通常会失败。

下面代码的主要问题是:应用程序卡住了几分钟,有时它会崩溃并创建一个损坏的 exe。

任何人都可以提出更好的方法来解决这个问题吗?

//add resource
procedure UpdateExeResource(Const Source,Dest:string);
var
Stream : TFileStream;
hDestRes : DWORD;
lpData : Pointer;
cbData : DWORD;
begin
Stream := TFileStream.Create(Source,fmOpenRead or fmShareDenyNone);
try
Stream.Seek(0, soFromBeginning);
cbData:=Stream.Size;
if cbData>0 then
begin
GetMem(lpData,cbData);
try
Stream.Read(lpData^, cbData);
hDestRes:= BeginUpdateResourceW(PChar(Dest), False);
if hDestRes <> 0 then

if UpdateResourceW(hDestRes, RT_RCDATA,'DATA',0,lpData,cbData) then
begin
if not EndUpdateResourceW(hDestRes,FALSE) then RaiseLastOSError
end
else
RaiseLastOSError
else
RaiseLastOSError;
finally
FreeMem(lpData);
end;
end;
finally
Stream.Free;
end;
end;

//Add or update resource
procedure TForm1.Button1Click(Sender: TObject);
begin
UpdateExeResource('asd.txt', 'copy.exe');
end;

最佳答案

您使用 Madres 单元的理由是什么,这不过是 Windows API 调用函数的恶搞BeginUpdateResource , UpdateResourceEndUpdateResource为了增加对旧 Windows 9x 系列(Win95,98,ME)的支持。

我建议您修改您的程序(正确)以引用实际的 Winapi.Windows 函数调用,方法是从使用部分中删除 Madres 单元,或者在调用时为函数添加前缀,如下所示:

  Winapi.Windows.BeginUpdateResourceW(...);
Winapi.Windows.UpdateResourceW(...);
Winapi.Windows.EndUpdateResourceW(...);

如果您需要对 9x 系列的支持,那么只需创建一个单独的方法来使用 Madres api 调用,并在实际需要时使用它。

另请注意,UpdateResourceW 期望它的字符串参数为 Unicode 格式。

关于delphi - 为什么向 exe 添加大量资源会很慢并且有时会损坏 exe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16728166/

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