通过HH8WilEdit学习WIL 文件编码 11 改变程序,用STREAM来读取WIL ,WIX 文件

 

 

unit TestWilMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


type
   TImageByte = array of Byte;


   TWMImageHeader = record
     Title: string[40];
     ImageCount: Integer;
     ColorCount: Integer;
     PaletteSize: Integer;
   end;


   TWMImageInfo = record
     Width: SmallInt;
     Height: SmallInt;
     px: SmallInt;
     py: SmallInt;
     bits: PByte;
   end;

   TWMIndexHeader = record
     Title: string[40];
     IndexCount: Integer;
   end;


   TWMIndexInfo = record
     Position: Integer;
     Size: Integer;
   end;

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);


    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WilStream: TFileStream ;
  IndexSteam: TFileStream;
  WilFileName: string;
  IndexFileName: string;
  WmImageHeader: TWMImageHeader;
  WmIndexHeader: TWMIndexHeader;
  WMImageInfo: TWMImageInfo;
  IndexList: array of Integer;
  ImageByte: TImageByte;
  v : Byte;
  str: string;




  x, y: SmallInt;
  offset: Integer;
  i: Integer;
implementation

{$R *.dfm}
function ExtractFileNameOnly(const fname: string): string;
var
  extpos: Integer;
  ext, fn: string;
begin
  ext := ExtractFileExt(fname);
  fn := ExtractFileName(fname);
  if ext <> '' then
  begin
    extpos := Pos(ext, fn);
    Result := Copy(fn, 1, extpos - 1);
  end else
    Result := fn;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    WilFileName := OpenDialog1.FileName;
    if WilFileName <> '' then
    begin
      Memo1.Clear;
      Memo1.Lines.Add(WilFileName);
      if WilStream <> nil then WilStream.Free;
      SetLength(IndexList, 0);
      WilStream := TFileStream.Create(WilFileName, fmOpenRead or fmShareDenyNone);
      WilStream.Position := 0;
      WilStream.Read(WmImageHeader, SizeOf(WmImageHeader));
      Memo1.Lines.Add('文件标示: ' + WmImageHeader.Title);
      Memo1.Lines.Add('图片数目:  ' + IntToStr(WmImageHeader.ImageCount));
      Memo1.Lines.Add('颜色数目:  ' + IntToStr(WmImageHeader.ColorCount));
      Memo1.Lines.Add('调色板大小:' + IntToStr(WmImageHeader.PaletteSize));
      Memo1.Lines.Add('文件大小:' + IntToStr(WilStream.Size));


      IndexFileName := ExtractFilePath(WilFileName) + ExtractFileNameOnly(WilFileName) + '.wix';
      if IndexSteam <> nil then IndexSteam.Free;
      Memo2.Clear;
      Memo2.Lines.Add(IndexFileName);
      IndexSteam := TFileStream.Create(IndexFileName, fmOpenRead or fmShareDenyNone);
      IndexSteam.Position := 0;
      IndexSteam.Read(WmIndexHeader, SizeOf(WmIndexHeader));
      Memo2.Lines.Add('文件标示: ' + WmIndexHeader.Title);
      Memo2.Lines.Add('图片数目:  ' + IntToStr(WmIndexHeader.IndexCount));
      SetLength(IndexList, WmIndexHeader.IndexCount);
      IndexSteam.Read(IndexList[0], 4 * WmIndexHeader.IndexCount);
      for i := 0 to WmIndexHeader.IndexCount -1  do
      begin
        Memo2.Lines.Add(IntToStr(i) + ': ' + IntToStr(IndexList[i]));
      end;

      for i := 0 to WmIndexHeader.IndexCount -1 do
      begin
        offset := IndexList[i];
        WilStream.Seek(offset, 0);
        WilStream.Read(WMImageInfo, SizeOf(WMImageInfo));
        Memo1.Lines.Add(IntToStr(i) + ':' + IntToStr(offset));
        Memo1.Lines.Add(IntToStr(WMImageInfo.Width) + '*' + IntToStr(WMImageInfo.Height));
        Memo1.Lines.Add(IntToStr(WMImageInfo.px) + '*' + IntToStr(WMImageInfo.py));

        WilStream.Seek(offset + 8, 0);
        str := '' ;
        for y := 0 to WMImageInfo.Height -1  do
           begin
            for x := 0 to WMImageInfo.Width -1  do
            begin
               WilStream.Read(v,1);
               str := str + ' ' + IntToStr(v)
            end;
            str := str + #13#10;
            end;
        Memo1.Lines.Add(str);
      end;
    end;
end;




procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if WilStream <> nil then  WilStream.Free;

  if IndexSteam <> nil then IndexSteam.Free;
end;

end.

读WIL文件,显示其信息。

学到了,

记录里面的指针是在程序运行后的内存中存在的,要求OS建立分配的,而不在磁盘的文件,或者读到内存中的文件流里面存在。

记录里的那个指针是记录的数据结构,是抽象的,用SIZEOF 看它占了4BYTE的空间, 但是对应与实际的磁盘文件的这个位置是无效的, 

memo   的一点点用法,其lines.add, #13#10回车换行

避免频繁的操作memo,它需要显示。可以操作一个字符串完成后再给MEMO。

对于指针的理解相当肤浅。

posted @ 2023-03-05 21:35  D7mir  阅读(79)  评论(0)    收藏  举报