-2

我有一个包含 4 个资源的项目。我的要求是将它们保存在 4 个不同的路径中。所以我定义了以下代码:

procedure TMainForm.FormCreate(Sender: TObject);
var
  ResStream: TResourceStream;
begin
  ResStream := TResourceStream.CreateFromID(HInstance, 00001, RT_RCDATA);
  try
    ResStream.Position := 1;
    ResStream.SaveToFile('C:\MyFile.dll');
  finally
    ResStream.Free;
  end;
end;

我从这个论坛得到它。然后我阅读了http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/delphivclwin32/!!MEMBEROVERVIEW_Classes_TResourceStream.html。但我不清楚TResourceStream.Position 。第一个资源是否应该为 1,第二个资源是否应该为 2,依此类推。

4

2 回答 2

3

在这一行

ResStream.Position := 1;

您正在设置流的位置。这类似于在文件中设置文件指针。的值Position与资源编号无关。文档是这样描述的:

指示当前在读取和写入流中的偏移量。

使用 Position 获取流的当前位置。这是从流数据开始的字节数。

事实上你根本不应该设置Position。它没有任何目的。您的代码可以是:

procedure SaveResourceToFile(const ID: Integer; const FileName: string);
var
  Stream: TResourceStream;
begin
  Stream := TResourceStream.CreateFromID(HInstance, ID, RT_RCDATA);
  try
    Stream.SaveToFile(FileName);
  finally
    Stream.Free;
  end;
end;

所以你需要调用这个函数四次,每次都传递资源的ID和目标文件名。

于 2013-04-11T20:00:17.280 回答
1

a的Position属性TResourceStream与它在任何其他TStream后代中的含义相同。它定义了流数据中的当前读取或写入位置。设置Position := 1意味着下一次读取或写入操作将从数据的第二个字节开始。

您通常不想设置Position为零以外的任何值,因为您想处理整个流。但是,在这种情况下,这并不重要SaveToFile总是将流的全部内容写入文件。当前位置无关紧要。

分别加载每个资源(即,对 的四个单独调用TResourceStream.Create)并保存每个资源。

于 2013-04-11T19:59:03.073 回答