{
从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.
从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.
解决方案 »
- AdoQuery的更新异常求救:当删除数据集为空后,在DbGrid中直接编辑,不能Post数据到后台数据库
- 请大虾指点如何用MAPX4.5开发GIS系统!
- 请问各位高手delphi7的行号怎么调出来?
- 大家快来BORLAND_DELPHI_V8.0_ARCHITECT_EDITION火热下载!!!!
- dbgrid 问题????
- midas做的多层数据库中M/D数据不能正确显示,是何道理?
- 谁能给我一份技术文档看看,分数可再加!
- 100分求解:如何用hook拦截一个opendialog
- 请教,LISTVIEW的STYLE设置为REPORT,共4个COLUMNS,如何取得某行某列的节点文字????
- 怎样指定richedit光标到指定行
- 请问Delphi中怎么运用TFrame?
- 高分求 《Windows程序设计》 电子版
ms.ReadComponent(MyData);谢谢!