自分のコードで 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;