Delphi 在线帮助中的 SDK.

解决方案 »

  1.   

    下面是使用内存映射文件做的一个简单文件加密器. 或许能够说明内存映射文件的基本用法.unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Buttons;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        btnEncrypt: TButton;
        memFileContent: TMemo;
        edtPassword: TEdit;
        Label1: TLabel;
        Open: TSpeedButton;
        edtFileName: TEdit;
        Label2: TLabel;
        OpenDialog1: TOpenDialog;
        procedure btnEncryptClick(Sender: TObject);
        procedure OpenClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        FileName: string;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btnEncryptClick(Sender: TObject);
    var
      FileHandle: HFILE;            // 文件句柄
      MapHandle: THandle;           // 文件内存映射句柄
      FileSize: Integer;            // 文件大小
      Data: PByte;                  // 文件数据区指针
      PData: PChar;                 // 文件数据区指针
      CurPos, SubStrPos: Integer;   // 文件数据区开始位置, 密码字符串当前位置
      SubStr: PChar;                // 密码字符串
    begin
      FileHandle := FileOpen(FileName, fmOpenReadWrite);
      if FileHandle = INVALID_HANDLE_VALUE then
        raise Exception.Create('Cannot open file.');
      FileSize := GetFileSize(FileHandle, nil);
      { 可以省去建立内存映射文件这一步, 直接使用文件的指针,
        那就简单多了. }
      try
        MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READWRITE, 0,
          FileSize, nil);
        if MapHandle = 0 then
          raise Exception.Create('Failed to create file mapping.');
      finally
        CloseHandle(FileHandle);
      end;
      try
        Data := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, FileSize);
        if Data = nil then
          raise Exception.Create('Failed to map view of file.');
      finally
        CloseHandle(MapHandle);
      end;
      { 开始工作 }
      try
        PData := PChar(Data);
        Inc(PData, FileSize);
        PData^ := #0;    // StrUpper(PChar(Data));
        Dec(PData, FileSize);    { 根据密码加密源文件 }
        SubStrPos := 0;
        SubStr := PChar(edtPassword.Text);
        for CurPos := 0 to FileSize - 1 do
        begin
          //if PData[CurPos] in ['a'..'z'] then Dec(PData[CurPos], $20)
          //else if PData[CurPos] in ['A'..'Z'] then Inc(PData[CurPos], $20);
          Byte(PData[CurPos]) := Byte(PData[CurPos]) xor Byte(SubStr[SubStrPos]); // 异或加密
          if SubStrPos > Length(SubStr) then SubStrPos := 0;
        end;  finally
        UnmapViewOfFile(Data);
      end;  memFileContent.Lines.LoadFromFile(FileName);
    end;procedure TForm1.OpenClick(Sender: TObject);
    begin
      if OpenDialog1.Execute then
      begin
        FileName := OpenDialog1.FileName;
        edtFileName.Text := FileName;
        memFileContent.Lines.LoadFromFile(FileName);
      end;
    end;end.