{
  从DLL文件中读取数据错误  定义一个类TMyData, 我将将读入一个TMemoryStream, 再写入到Dll文件中,
  这些动作完全正常; 可是在读出时, 提示: Invalid stream format, 具体行
  请看procedure TForm1.Button2Click(Sender: TObject)中加注释的一句
}unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TMyData = class(TComponent)
  private
    FFirstName: String;
    FLastName: String;
  published
    property FirstName: String read FFirstName write FFirstName;
    property LastName: String read FLastName write FLastName;
  end;  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}// 写操作, 一切正常
procedure TForm1.Button1Click(Sender: TObject);
var
  hExe: THandle;
  Temp: TMyData;
  ms: TMemoryStream;
begin
  Temp := TMyData.Create(nil);
  try
    with Temp do
    begin
      FirstName := 'Michael';
      LastName := 'Jackson';
    end;
    hExe := BeginUpdateResource(PChar('res.dll'), True);
    if hExe = 0 then Exit;    ms := TMemoryStream.Create;
    try
      ms.WriteComponent(Temp);
      UpdateResource(hExe, RT_RCDATA, PChar('MYDATA'), 4, ms, ms.Size);
    finally
      ms.Free;
    end;
    EndUpdateResource(hExe, False);
  finally
    Temp.Free;
  end;
end;// 读操作
procedure TForm1.Button2Click(Sender: TObject);
var
  hExe, hRes: THandle;
  hlr: Cardinal;
  ms: TMemoryStream;
  MyData: TMyData;
  PData: Pointer;
begin
  hExe := SafeLoadLibrary('res.dll');
  if hExe = 0 then Exit;
  hRes := FindResource(hExe, PChar('MYDATA'), RT_RCDATA);
  if hRes = 0 then Exit;
  hlr := LoadResource(hExe, hRes);  MyData := TMyData.Create(nil);
  try
    ms := TMemoryStream.Create;
    try
      PData := LockResource(hlr);
      ms.Write(PData^, SizeofResource(hExe, hRes));  // 这句出错了, Invalid Stream Format
      ms.Seek(0, soFromBeginning);
      ms.ReadComponent(MyData);
      Caption := MyData.FirstName + ' ' + MyData.LastName;
    finally
      ms.Free;
    end;
  finally
    MyData.Free;
  end;
  UnlockResource(hlr);
  FreeResource(hRes);
  FreeLibrary(hExe);
end;end.