1

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

1 に答える 1

3

古い W​​indows 9x ファミリ (Win95,98,ME) のサポートを追加するために、Windows API 呼び出し関数BeginUpdateResourceUpdateResource、およびEndUpdateResourceのなりすましにすぎない Madres ユニットを使用する理由は何ですか。

手順を (適切に) 変更して、実際のWinapi.Windows関数呼び出しを参照することをお勧めします:

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

9x ファミリのサポートが必要な場合は、Madres API 呼び出しを使用するための別のメソッドを作成し、実際に必要なときにそれを使用してください。

また、UpdateResourceW は、文字列パラメーターが Unicode 形式であると想定していることにも注意してください。

于 2013-05-24T10:09:08.990 に答える