Contributor: LEE ARONER 
{
 I've been puzzling over Share myself the last week. Here's some
 tips from what I've found:
 1. Remember, if you are trying to write to the same region from
 both processes, you will *still* get a sharing violation with
 access denied to the last one to ask ! There is a subfunc, (440Bh
 I think) for changing the default number of tries that share will
 retry for access. You might want to look into that. Otherwise you
 could use something like the OpenTxtFile routine below, modified
 for use on non-text files, or both. (You aren't trying to share
 text files are you? If so, there IS a way to do it, let me know).
 2. Also note that you set the filemode AFTER assignment, and
 BEFORE a reset, rewrite or append.
 3. The following are 2 functions I've put together to handle my
 stuff. Note that the first is for non-text files, the second is
 for text files. The text file routine uses an external TFDD unit
 to set up the filemode variable so it works with text files.
 Holler if you want the unit also.........
 (* Call this to lock or unlock the ENTIRE file
****** use lock =00ドル & unlock = 01ドル constants for action *********
 ***** SHARE.EXE MUST be loaded ! *******
 Do NOT use on Text Files ! will NOT work !
You could modify this to only lock certain regions by passing values
for a start and stop region. Load CX/DX and DI/SI as done below. *)
}
Function LockFile(var f; action:byte):boolean;
Var
 fsize : longint;
Begin
 if GotShare then (* Share loaded ? *)
 begin
 fsize := longint(filesize(file(f))); (* Get filesize *)
 Regs.AH := 5ドルC; (* Subfunc *)
 Regs.AL := Action; (* 00ドル=Lock or 01ドル=unlock *)
 Regs.BX := FileRec(f).Handle; (* Git the handle *)
 Regs.CX := Hi(00ドル); (* Start of file *)
 Regs.DX := Lo(00ドル);
 Regs.DI := Lo(fsize); (* Compute end of file *)
 Regs.SI := Hi(fsize);
 Intr(21,ドル Regs);
 if ((Regs.FLAGS and 01ドル) = 0) then LockFile := true
 else
 begin
 IORes := regs.AX; (* If fails, errcode is in AX *)
 LockFile := false; (* IORes is a global that gets *)
 end; (* used in IOReport if an error *)
 end;
End;
(*-------------------------------------------------------------*)
 (* Share compatable Will retry if access denied, tries times
 5 Tries is equivilent to a 1/2 second wait
 ----- Sharing Method -----
 Access Compatibility Deny Deny Deny Deny
 Method Mode Both Write Read None
 ---------------------------------------------------------
 Read Only 0 16 32 48 64
 Write Only 1 17 33 49 65
 Read/Write 2* 18 34 50 66
 * = default *)
FUNCTION OpenTxtFile(var f; fname:string; tries:word):boolean;
VAR
 i : word;
Begin
 i := 0;
 if GotShare then (* Share loaded ? *)
 begin
 AssignText(text(f),Fname); (* From TxtShare unit *)
 FileMode := 34; (* Open in r/w-deny write mode *)
 end
 else Assign(text(f),Fname);
 Repeat
 {$I-} Reset(text(f));
 IORes := IoResult; {$I+}
 if IORes = 5 then (* Only repeat if denied access *)
 begin
 wait(100); (* Wait 1/10 second before retry *)
 INC(i); (* Use your own delay routine here *)
 end
 else i := tries; (* Quit if not a sharing deny *)
 Until (IORes = 0) OR (i>= tries);
 if GotShare then FileMode := 2; (* Set FileMode to default *)
 OpenTxtFile := IORes = 0;
End;
{ ****** Here's a quick SHARE detect routine ********* }
Function ShareInstalled : boolean; assembler;
asm
 mov ax,1000ドル
 int 2ドルf
end;
 

AltStyle によって変換されたページ (->オリジナル) /