Contributor: LARS HELLSTEN            

===========================================================================
 BBS: Canada Remote Systems
Date: 06-16-93 (16:14)             Number: 26531
From: LARS HELLSTEN                Refer#: NONE
  To: RITO SALOMONE                 Recvd: NO  
Subj: Re: Novell/File Locking/S      Conf: (1221) F-PASCAL
---------------------------------------------------------------------------
RS> Does anyone have any samples of network file sharing/access code for Turbo
RS> Pascal/Borland Pascal 6-7.

   Here's some source that I use.  I haven't had a chance to test it out
as much as I'd like to, but so far, it appears to work quite nicely:

--- 8< --------------------------------------------------------------------
Unit Share;

INTERFACE

Uses DOS;

Var
   ShareInstalled : Boolean;

Function LockRec(Var Untyped; pos, size : LongInt) : Boolean;
Function UnLockRec(Var Untyped; pos, size : LongInt) : Boolean;
Procedure FMode(Mode : Byte);
Function Share : Boolean;

IMPLEMENTATION

Function LockRec(Var Untyped; pos, size : LongInt) : Boolean;

Var
   Regs : Registers;
   f : File absolute Untyped;

Begin
   pos := pos * FileRec(f).RecSize;
   size := size * FileRec(f).RecSize;
   Regs.AH := $5C;
   Regs.AL := $00;
   Regs.BX := FileRec(f).Handle;
   Regs.CX := Hi(pos);
   Regs.DX := Lo(pos);
   Regs.SI := Hi(size);
   Regs.DI := Lo(size);
   Intr($21,Regs);
   LockRec := (Regs.Flags AND FCarry) = 0;
End; { LockRec }

Function UnLockRec(Var Untyped; pos, size : LongInt) : Boolean;

Var
   Regs : Registers;
   f : File absolute Untyped;

Begin
   pos := pos * FileRec(f).RecSize;
   size := size * FileRec(f).RecSize;
   Regs.AH := $5C;
   Regs.AL := $01;
   Regs.BX := FileRec(f).Handle;
   Regs.CX := Hi(pos);
   Regs.DX := Lo(pos);
   Regs.SI := Hi(size);
   Regs.DI := Lo(size);
   Intr($21,Regs);
   UnlockRec := (Regs.Flags AND FCarry) = 0;
End; { UnLockRec }

Procedure FMode(Mode : Byte);

Begin
   If ShareInstalled then
      If (mode in [0..2,23..24,48..50,64..66]) then
         FileMode := Mode;
End;

function Share : boolean;
var regs : registers;
begin
    with regs do
    begin
        AH := 16;
        AL := 0;
        Intr($2f, regs);
        Share := AL = 255;
    end;
end; { IsShare }

Begin
   ShareInstalled := Share;
End. { MyShare }
--- 8< ---------------------------------------------------------------------

   By the way, the unit name should be "MyShare", there's duplicate
identifiers in there by accident.  All you do, is call the lock/unlock
routines, passing the file variable, the record number, and the number of
records (you'll see it determines the size itself, using the FileRec.RecSize
variable).  The FMode procedure doesn't do much, I just use it instead of
constantly putting "If ShareInstalled then FileMode :=..." inside the
program(s).  You should call this to set the FileMode variable to a sharing
method, before you reset the file.  Here's a table of values you can pass:

                                         Sharing Method
Access Method   Compatibility  Deny Write  Deny Read  Deny None
-------------------------------------------------------------------
Read Only             0            32         48         64
Write Only            1            33         49         65
Read/Write            2            34         50         66
-------------------------------------------------------------------

--- GEcho 1.00
 * Origin: Access-PC BBS þ Scarborough, ON þ (416)491-9249 (1:250/320)