[Back to DOS SWAG index] [Back to Main SWAG index] [Original]
===========================================================================
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)
[Back to DOS SWAG index] [Back to Main SWAG index] [Original]