返回
{***************************************************************}
{***               FVision Unit Version1.0                   ***}
{***                    蓝蚂蚁工作室                         ***}
{***************************************************************}
{***                    XMS支持单元                          ***}
{***************************************************************}
{$F+}
Unit FXmsDrv;
Interface
Uses
  Dos;
Const
  XmsCanUse:Boolean=False;

Const
  rxUser    = $01;
  rxEnd     = $02;
  rxUserEnd = $03;
  wxAppend  = $01;
  wxReWrite = $02;

Function TestXms:Boolean;
Function GetXmsSize:Word;
Function MallocXms(Size:Word):Word;
Function FreeXms(Handle:Word):Boolean;
Function MoveXms(TPtr:Pointer;THandle:Word;SPtr:Pointer;SHandle:Word;Length:Longint):Word;
Function ReadFileToXms(Name:PathStr;Pos,Length:Longint;Mode:Byte):Word;
Procedure WriteXmsToFile(Handle:Word;Name:PathStr;Pos,Length:Longint;Mode:Byte);
Implementation
{$L XMS.OBJ}
Function TestXms:Boolean;external;
Function GetXmsSize:Word;external;
Function MallocXms(Size:Word):Word;external;
Function FreeXms(Handle:Word):Boolean;external;
Function MoveXms(TPtr:Pointer;THandle:Word;SPtr:Pointer;SHandle:Word;Length:Longint):Word;external;

Function ReadFileToXms(Name:PathStr;Pos,Length:Longint;Mode:Byte):Word;
var
  Fp:File;
  Len,Dlt:Longint;
  Handle,Result:Word;
  i:Integer;
  P:Pointer;
begin
  ReadFileToXms:=0;
  if not XmsCanUse then Exit;
  Assign(Fp,Name);
  {$i-}Reset(Fp,1);{$i+}
  if IOResult<>0 then Exit;
  Len:=Length;
  if Mode=rxEnd then Len:=FileSize(Fp)-Pos;
  Seek(Fp,Pos);
  Handle:=MallocXms((Len-1) div 1024 +1);
  if Mode=rxUserEnd then Len:=FileSize(Fp)-Pos;
  GetMem(P,20480);
  Dlt:=0;
  for i:=0 to ((Len-1) div 20480) do
  begin
    BlockRead(Fp,P^,20480,Result);
    if Result>0 then
    begin
      if Odd(Result) then Inc(Result);
      MoveXms(Pointer(Dlt),Handle,P,0,Result);
    end;
    Inc(Dlt,Result);
  end;
  FreeMem(P,20480);
  {$i-}Close(Fp);{$i+}
  ReadFileToXms:=Handle;
end;

Procedure WriteXmsToFile(Handle:Word;Name:PathStr;Pos,Length:Longint;Mode:Byte);
var
  Fp:File;
  Len,Dlt,WriteLen:Longint;
  Result:Word;
  i:Integer;
  P:Pointer;
begin
  if (not XmsCanUse)or(Handle=0) then Exit;
  Assign(Fp,Name);
  if Mode=wxAppend then
  begin
    {$i-}Reset(Fp,1);{$i+}
    Seek(Fp,FileSize(Fp));
  end else
    {$i-}ReWrite(Fp,1);{$i+}
  if IOResult<>0 then Exit;
  Len:=Length;
  GetMem(P,20480);
  Dlt:=0;
  for i:=0 to ((Len-1) div 20480) do
  begin
    BlockRead(Fp,P^,20480,Result);
    if Dlt+20480<Len then
    begin
      MoveXms(P,0,Pointer(Pos+Dlt),Handle,20480);
      BlockWrite(Fp,P^,20480,Result);
    end else
    begin
      WriteLen:=Len-Dlt;
      if Odd(Len-Dlt) then Inc(Len);
      MoveXms(P,0,Pointer(Pos+Dlt),Handle,Len-Dlt);
      BlockWrite(Fp,P^,WriteLen,Result);
    end;
    Inc(Dlt,20480);
  end;
  FreeMem(P,20480);
  {$i-}Close(Fp);{$i+}
end;

end.