关于在DLL或EXE或其他文件中读写自定义数据的处理:unit AttachFile.AttachClass;interfaceuses
Classes, SysUtils;const
AttachTag = 'sanmaotuo';type
TAttachFooter = packed record
FileOriginalSize: Integer;
Tag: array[0..8] of Char;
end; TAttach = class
private
FFooter: TAttachFooter;
FFileName: string;
protected
public
constructor Create(FileName: string);
function Read(var Stream: TStream): Boolean;
function Write(var Stream: TStream): Boolean;
end;
implementation{ TAttach }constructor TAttach.Create(FileName: string);
begin
inherited Create;
FFileName := FileName;
end;function TAttach.Read(var Stream: TStream): Boolean;
var
_File: File;
_FileMode: Integer;
CurrentSize: Integer;
_Buffer: array of Char;
BufferSize: Integer;
begin
Result := False;
Assert(Stream <> nil, '参数无效');
AssignFile(_File, FFileName);
_FileMode := FileMode;
FileMode := 0;
Reset(_File, 1);
try
try
CurrentSize := FileSize(_File);
Seek(_File, CurrentSize -SizeOf(FFooter));
BlockRead(_File, FFooter, Sizeof(FFooter)); if FFooter.Tag <> AttachTag then
raise Exception.Create('读数据失败'); BufferSize := CurrentSize -FFooter.FileOriginalSize -SizeOf(FFooter);
SetLength(_Buffer, BufferSize);
Seek(_File, FFooter.FileOriginalSize);
BlockRead(_File, Pointer(_Buffer)^, BufferSize);
Stream.WriteBuffer(_Buffer[0], BufferSize);
Result := True;
except
//
end;
finally
CloseFile(_File);
FileMode := _FileMode;
end;
end;function TAttach.Write(var Stream: TStream): Boolean;
var
_File: File;
OriginalSize: Integer;
_Buffer: array of PChar;
BufferSize: Integer;
begin
Result := False;
Assert(Stream <> nil, '参数无效');
AssignFile(_File, FFileName);
Reset(_File, 1);
try
try
OriginalSize := FileSize(_File);
Seek(_File, OriginalSize); BufferSize := Stream.Size;
SetLength(_Buffer, BufferSize); Stream.Seek(0, soBeginning);
Stream.ReadBuffer(Pointer(_Buffer)^, BufferSize); BlockWrite(_File, Pointer(_Buffer)^, BufferSize); FillChar(FFooter, SizeOf(FFooter), 0);
FFooter.FileOriginalSize := OriginalSize;
FFooter.Tag := AttachTag;
BlockWrite(_File, FFooter, Sizeof(FFooter)); Result := True;
except
//
end;
finally
CloseFile(_File);
end;
end;......测试unit AttachFile.MainForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TAttachForm = class(TForm)
ButtonRead: TButton;
ButtonWrite: TButton;
ImageRead: TImage;
ImageWrite: TImage;
procedure ButtonWriteClick(Sender: TObject);
procedure ButtonReadClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
AttachForm: TAttachForm;implementationuses AttachFile.AttachClass;{$R *.dfm}procedure TAttachForm.ButtonWriteClick(Sender: TObject);
var
Stream : TStream;
Attach : TAttach;
begin
ImageWrite.Picture.Bitmap.LoadFromFile('User.bmp');
Stream := TMemoryStream.Create;
ImageWrite.Picture.Bitmap.SaveToStream(Stream);
Attach := TAttach.Create('dbexpdb2.dll'); //DLL测试
//Attach := TAttach.Create('Delphi32.exe'); //EXE测试
Attach.Write(Stream);
FreeAndNil(Stream);
FreeAndNil(Attach);
end;procedure TAttachForm.ButtonReadClick(Sender: TObject);
var
Stream : TStream;
Attach : TAttach;
begin
Stream := TMemoryStream.Create;
Attach := TAttach.Create('dbexpdb2.dll'); //DLL测试
//Attach := TAttach.Create('Delphi32.exe'); //EXE测试
Attach.Read(Stream);
Stream.Position := 0;
ImageRead.Picture.Bitmap.LoadFromStream(Stream);
FreeAndNil(Stream);
FreeAndNil(Attach);
end;
......未完成的遗留问题1、修改打印机首选项2、一条语句完成WORD文档的各种颜色字体的反色(我用的是循环,提问社员不满意)......2日内完成答谢仪式,然后潜水去MAKE MONEY & WRITE ARTICLES. ......春节后再见。......再次感谢各位社员的帮助、指导和提携。
Classes, SysUtils;const
AttachTag = 'sanmaotuo';type
TAttachFooter = packed record
FileOriginalSize: Integer;
Tag: array[0..8] of Char;
end; TAttach = class
private
FFooter: TAttachFooter;
FFileName: string;
protected
public
constructor Create(FileName: string);
function Read(var Stream: TStream): Boolean;
function Write(var Stream: TStream): Boolean;
end;
implementation{ TAttach }constructor TAttach.Create(FileName: string);
begin
inherited Create;
FFileName := FileName;
end;function TAttach.Read(var Stream: TStream): Boolean;
var
_File: File;
_FileMode: Integer;
CurrentSize: Integer;
_Buffer: array of Char;
BufferSize: Integer;
begin
Result := False;
Assert(Stream <> nil, '参数无效');
AssignFile(_File, FFileName);
_FileMode := FileMode;
FileMode := 0;
Reset(_File, 1);
try
try
CurrentSize := FileSize(_File);
Seek(_File, CurrentSize -SizeOf(FFooter));
BlockRead(_File, FFooter, Sizeof(FFooter)); if FFooter.Tag <> AttachTag then
raise Exception.Create('读数据失败'); BufferSize := CurrentSize -FFooter.FileOriginalSize -SizeOf(FFooter);
SetLength(_Buffer, BufferSize);
Seek(_File, FFooter.FileOriginalSize);
BlockRead(_File, Pointer(_Buffer)^, BufferSize);
Stream.WriteBuffer(_Buffer[0], BufferSize);
Result := True;
except
//
end;
finally
CloseFile(_File);
FileMode := _FileMode;
end;
end;function TAttach.Write(var Stream: TStream): Boolean;
var
_File: File;
OriginalSize: Integer;
_Buffer: array of PChar;
BufferSize: Integer;
begin
Result := False;
Assert(Stream <> nil, '参数无效');
AssignFile(_File, FFileName);
Reset(_File, 1);
try
try
OriginalSize := FileSize(_File);
Seek(_File, OriginalSize); BufferSize := Stream.Size;
SetLength(_Buffer, BufferSize); Stream.Seek(0, soBeginning);
Stream.ReadBuffer(Pointer(_Buffer)^, BufferSize); BlockWrite(_File, Pointer(_Buffer)^, BufferSize); FillChar(FFooter, SizeOf(FFooter), 0);
FFooter.FileOriginalSize := OriginalSize;
FFooter.Tag := AttachTag;
BlockWrite(_File, FFooter, Sizeof(FFooter)); Result := True;
except
//
end;
finally
CloseFile(_File);
end;
end;......测试unit AttachFile.MainForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TAttachForm = class(TForm)
ButtonRead: TButton;
ButtonWrite: TButton;
ImageRead: TImage;
ImageWrite: TImage;
procedure ButtonWriteClick(Sender: TObject);
procedure ButtonReadClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
AttachForm: TAttachForm;implementationuses AttachFile.AttachClass;{$R *.dfm}procedure TAttachForm.ButtonWriteClick(Sender: TObject);
var
Stream : TStream;
Attach : TAttach;
begin
ImageWrite.Picture.Bitmap.LoadFromFile('User.bmp');
Stream := TMemoryStream.Create;
ImageWrite.Picture.Bitmap.SaveToStream(Stream);
Attach := TAttach.Create('dbexpdb2.dll'); //DLL测试
//Attach := TAttach.Create('Delphi32.exe'); //EXE测试
Attach.Write(Stream);
FreeAndNil(Stream);
FreeAndNil(Attach);
end;procedure TAttachForm.ButtonReadClick(Sender: TObject);
var
Stream : TStream;
Attach : TAttach;
begin
Stream := TMemoryStream.Create;
Attach := TAttach.Create('dbexpdb2.dll'); //DLL测试
//Attach := TAttach.Create('Delphi32.exe'); //EXE测试
Attach.Read(Stream);
Stream.Position := 0;
ImageRead.Picture.Bitmap.LoadFromStream(Stream);
FreeAndNil(Stream);
FreeAndNil(Attach);
end;
......未完成的遗留问题1、修改打印机首选项2、一条语句完成WORD文档的各种颜色字体的反色(我用的是循环,提问社员不满意)......2日内完成答谢仪式,然后潜水去MAKE MONEY & WRITE ARTICLES. ......春节后再见。......再次感谢各位社员的帮助、指导和提携。
---------------
强烈反对,怎么和俺重名了?
----
回复人:sxqwhxq(步青云) ( 五级(中级)) 信誉:85 我只想保持这样,不想升星。
某些星并不代表水平高,"只是在某一方面比较强而已。"