关于在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. ......春节后再见。......再次感谢各位社员的帮助、指导和提携。

解决方案 »

  1.   

    yyjzsl(阿木) 
    ---------------
    强烈反对,怎么和俺重名了?
      

  2.   

    我才三条,唉,不知何日赶上老冯。另:请zuoansuifeng兄帮我看看那个DELPHI发送XML的问题,谢谢。
      

  3.   

    值得推敲...
    ----
     回复人:sxqwhxq(步青云) ( 五级(中级)) 信誉:85  我只想保持这样,不想升星。
    某些星并不代表水平高,"只是在某一方面比较强而已。"
      

  4.   

    200分的帖子啊,不抢白不抢~~ 对吧 冯小子 玩潜水 那可不好啊to: DURON800(言之有理)  偶来了 鞭炮放起来 ~~
      

  5.   

    作揖.谢谢各位捧场。老冯11月8日开始闯荡社区,从光屁股蛋一个混到5条Panties, 全靠各位提携。