为什么向exe添加大量资源很慢,有时会破坏exe?

时间:2013-05-24 05:25:13

标签: delphi delphi-xe2

我正在我自己的代码中尝试使用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;

1 个答案:

答案 0 :(得分:3)

您使用Madres单元的原因是什么,它只不过是Windows API调用函数BeginUpdateResourceUpdateResourceEndUpdateResource的恶搞,以便添加对旧Windows的支持9x家庭(Win95,98,ME)。

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

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

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

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