3 This file is part of the Free Pascal run time library
.
4 Copyright (c
) 1999-2000 by the Free Pascal development team
.
6 Dos unit
for BP7 compatible RTL
8 See the file COPYING
.FPC
, included
in this distribution
,
9 for details about the copyright
.
11 This program is distributed
in the hope that it will be useful
,
12 but WITHOUT ANY WARRANTY
; without even the implied warranty of
13 MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE
.
15 **********************************************************************}
19 { Include Win32 Consts
,Types
}
25 {Bitmasks
for CPU Flags
}
33 {Bitmasks
for file attribute
}
50 { Needed
for Win95 LFN Support
}
52 PathStr
= String
[255];
54 NameStr
= String
[255];
58 filerec
.inc contains the definition of the filerec
.
59 textrec
.inc contains the definition of the textrec
.
60 It is
in a separate file to make it available
in other units without
61 having to use the DOS unit
for it
.
66 DateTime
= packed record
75 PWin32FindData
= ^TWin32FindData
;
76 TWin32FindData
= record
77 dwFileAttributes
: Cardinal
;
78 ftCreationTime
: TFileTime
;
79 ftLastAccessTime
: TFileTime
;
80 ftLastWriteTime
: TFileTime
;
81 nFileSizeHigh
: Cardinal
;
82 nFileSizeLow
: Cardinal
;
83 dwReserved0
: Cardinal
;
84 dwReserved1
: Cardinal
;
85 cFileName
: array
[0..MAX_PATH
- 1] of Char
;
86 cAlternateFileName
: array
[0..13] of Char
;
87 // The structure should be
320 bytes long
...
91 Searchrec
= Packed Record
93 W32FindData
: TWin32FindData
;
94 ExcludeAttr
: longint
;
102 registers
= packed record
104 0 : (ax
,f1
,bx
,f2
,cx
,f3
,dx
,f4
,bp
,f5
,si
,f51
,di
,f6
,ds
,f7
,es
,f8
,flags
,fs
,gs
: word
);
105 1 : (al
,ah
,f9
,f10
,bl
,bh
,f11
,f12
,cl
,ch
,f13
,f14
,dl
,dh
: byte
);
106 2 : (eax
, ebx
, ecx
, edx
, ebp
, esi
, edi
: longint
);
113 Procedure
Intr(intno
: byte
; var regs
: registers
);
114 Procedure
MSDos(var regs
: registers
);
117 Function DosVersion
: Word
;
118 Procedure
GetDate(var year
, month
, mday
, wday
: word
);
119 Procedure
GetTime(var hour
, minute
, second
, sec100
: word
);
120 procedure
SetDate(year
,month
,day
: word
);
121 Procedure
SetTime(hour
,minute
,second
,sec100
: word
);
122 Procedure
UnpackTime(p
: longint
; var t
: datetime
);
123 Procedure
PackTime(var t
: datetime
; var p
: longint
);
126 Procedure
Exec(const path
: pathstr
; const comline
: comstr
);
127 Function DosExitCode
: word
;
130 Function
DiskFree(drive
: byte
) : int64
;
131 Function
DiskSize(drive
: byte
) : int64
;
132 Procedure
FindFirst(const path
: pathstr
; attr
: word
; var f
: searchRec
);
133 Procedure
FindNext(var f
: searchRec
);
134 Procedure
FindClose(Var f
: SearchRec
);
137 Procedure
GetFAttr(var f
; var attr
: word
);
138 Procedure
GetFTime(var f
; var time
: longint
);
139 Function
FSearch(path
: pathstr
; dirlist
: string
): pathstr
;
140 Function
FExpand(const path
: pathstr
): pathstr
;
141 Procedure
FSplit(path
: pathstr
; var dir
: dirstr
; var name
: namestr
; var ext
: extstr
);
142 function
GetShortName(var p
: String
) : boolean
;
143 function
GetLongName(var p
: String
) : boolean
;
146 Function EnvCount
: longint
;
147 Function
EnvStr(index
: integer
): string
;
148 Function
GetEnv(envvar
: string
): string
;
151 Procedure
SetFAttr(var f
; attr
: word
);
152 Procedure
SetFTime(var f
; time
: longint
);
153 Procedure
GetCBreak(var breakvalue
: boolean
);
154 Procedure
SetCBreak(breakvalue
: boolean
);
155 Procedure
GetVerify(var verify
: boolean
);
156 Procedure
SetVerify(verify
: boolean
);
158 {Do Nothing Functions
}
159 Procedure SwapVectors
;
160 Procedure
GetIntVec(intno
: byte
; var vector
: pointer
);
161 Procedure
SetIntVec(intno
: byte
; vector
: pointer
);
162 Procedure
Keep(exitcode
: word
);
165 { allow EXEC to inherited handles from calling process
,
166 needed
for FPREDIR
in ide
/text
167 now set to
true by default because
168 other OS also pass open handles to childs
169 finally reset to
false after Florian
's response PM }
170 ExecInheritsHandles : BOOL = false;
175 OSVERSIONINFO = record
176 dwOSVersionInfoSize : DWORD;
177 dwMajorVersion : DWORD;
178 dwMinorVersion : DWORD;
179 dwBuildNumber : DWORD;
180 dwPlatformId : DWORD;
181 szCSDVersion : array[0..127] of char;
184 LPOSVERSIONINFO = ^OSVERSIONINFO;
187 versioninfo : OSVERSIONINFO;
188 kernel32dll : THandle;
190 {******************************************************************************
192 ******************************************************************************}
194 function GetLastError : DWORD;
195 external 'kernel32
' name 'GetLastError
';
196 function FileTimeToDosDateTime(const ft :TFileTime;var data,time : word) : longbool;
197 external 'kernel32
' name 'FileTimeToDosDateTime
';
198 function DosDateTimeToFileTime(date,time : word;var ft :TFileTime) : longbool;
199 external 'kernel32
' name 'DosDateTimeToFileTime
';
200 function FileTimeToLocalFileTime(const ft : TFileTime;var lft : TFileTime) : longbool;
201 external 'kernel32
' name 'FileTimeToLocalFileTime
';
202 function LocalFileTimeToFileTime(const lft : TFileTime;var ft : TFileTime) : longbool;
203 external 'kernel32
' name 'LocalFileTimeToFileTime
';
206 Longrec=packed record
210 function Last2DosError(d:dword):integer;
216 Function DosToWinAttr (Const Attr : Longint) : longint;
222 Function WinToDosAttr (Const Attr : Longint) : longint;
228 Function DosToWinTime (DTime:longint;Var Wtime : TFileTime):longbool;
232 DosToWinTime:=DosDateTimeToFileTime(longrec(dtime).hi,longrec(dtime).lo,lft) and
233 LocalFileTimeToFileTime(lft,Wtime);
237 Function WinToDosTime (Const Wtime : TFileTime;var DTime:longint):longbool;
241 WinToDosTime:=FileTimeToLocalFileTime(WTime,lft) and
242 FileTimeToDosDateTime(lft,longrec(dtime).hi,longrec(dtime).lo);
246 {******************************************************************************
247 --- Dos Interrupt ---
248 ******************************************************************************}
250 procedure intr(intno : byte;var regs : registers);
255 procedure msdos(var regs : registers);
261 {******************************************************************************
262 --- Info / Date / Time ---
263 ******************************************************************************}
265 function GetVersion : longint;
266 external 'kernel32
' name 'GetVersion
';
267 procedure GetLocalTime(var t : TSystemTime);
268 external 'kernel32
' name 'GetLocalTime
';
269 function SetLocalTime(const t : TSystemTime) : longbool;
270 external 'kernel32
' name 'SetLocalTime
';
272 function dosversion : word;
274 dosversion:=GetVersion;
278 procedure getdate(var year,month,mday,wday : word);
290 procedure setdate(year,month,day : word);
294 { we need the time set privilege }
295 { so this function crash currently }
301 { only a quite good solution, we can loose some ms }
306 procedure gettime(var hour,minute,second,sec100 : word);
314 sec100:=t.wMilliSeconds div 10;
318 procedure settime(hour,minute,second,sec100 : word);
322 { we need the time set privilege }
323 { so this function crash currently }
329 t.wMilliSeconds:=sec100*10;
334 Procedure packtime(var t : datetime;var p : longint);
336 p:=(t.sec shr 1)+(t.min shl 5)+(t.hour shl 11)+(t.day shl 16)+(t.month shl 21)+((t.year-1980) shl 25);
340 Procedure unpacktime(p : longint;var t : datetime);
344 sec:=(p and 31) shl 1;
345 min:=(p shr 5) and 63;
346 hour:=(p shr 11) and 31;
347 day:=(p shr 16) and 31;
348 month:=(p shr 21) and 15;
349 year:=(p shr 25)+1980;
354 {******************************************************************************
356 ******************************************************************************}
358 function CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar;
359 lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
360 bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
361 lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
362 var lpProcessInformation: TProcessInformation): longbool;
363 external 'kernel32
' name 'CreateProcessA
';
364 function getExitCodeProcess(h:THandle;var code:longint):longbool;
365 external 'kernel32
' name 'GetExitCodeProcess
';
366 function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD;
367 external 'kernel32
' name 'WaitForSingleObject
';
368 function CloseHandle(h : THandle) : longint;
369 external 'kernel32
' name 'CloseHandle
';
372 lastdosexitcode : longint;
374 procedure exec(const path : pathstr;const comline : comstr);
377 PI: TProcessInformation;
381 AppParam : array[0..255] of char;
383 FillChar(SI, SizeOf(SI), 0);
386 Move(Path[1],AppPath,length(Path));
387 AppPath[Length(Path)]:=#0;
390 Move(ComLine[1],AppParam[2],length(Comline));
391 AppParam[Length(ComLine)+2]:=#0;
392 if not CreateProcess(PChar(@AppPath), PChar(@AppParam),
393 Nil, Nil, ExecInheritsHandles,$20, Nil, Nil, SI, PI) then
395 DosError:=Last2DosError(GetLastError);
401 CloseHandle(PI.hThread);
402 if WaitForSingleObject(Proc, Infinite) <> $ffffffff then
403 GetExitCodeProcess(Proc,l)
411 function dosexitcode : word;
413 dosexitcode:=lastdosexitcode and $ffff;
417 procedure getcbreak(var breakvalue : boolean);
419 { !! No Win32 Function !! }
423 procedure setcbreak(breakvalue : boolean);
425 { !! No Win32 Function !! }
429 procedure getverify(var verify : boolean);
431 { !! No Win32 Function !! }
435 procedure setverify(verify : boolean);
437 { !! No Win32 Function !! }
441 {******************************************************************************
443 ******************************************************************************}
445 function GetDiskFreeSpace(drive:pchar;var sector_cluster,bytes_sector,
446 freeclusters,totalclusters:longint):longbool;
447 external 'kernel32
' name 'GetDiskFreeSpaceA
';
449 TGetDiskFreeSpaceEx = function(drive:pchar;var availableforcaller,
450 total,free):longbool;stdcall;
453 GetDiskFreeSpaceEx : TGetDiskFreeSpaceEx;
455 function diskfree(drive : byte) : int64;
457 disk : array[1..4] of char;
459 free,total : longint;
460 qwtotal,qwfree,qwcaller : int64;
471 disk
[1]:=chr(drive
+64);
476 if assigned(GetDiskFreeSpaceEx) then
478 if GetDiskFreeSpaceEx(@disk,qwcaller,qwtotal,qwfree) then
485 if GetDiskFreeSpace(@disk,secs,bytes,free,total) then
486 diskfree:=int64(free)*secs*bytes
493 function disksize(drive : byte) : int64;
495 disk : array[1..4] of char;
497 free,total : longint;
498 qwtotal,qwfree,qwcaller : int64;
508 disk
[1]:=chr(drive
+64);
513 if assigned(GetDiskFreeSpaceEx) then
515 if GetDiskFreeSpaceEx(@disk,qwcaller,qwtotal,qwfree) then
522 if GetDiskFreeSpace(@disk,secs,bytes,free,total) then
523 disksize:=int64(total)*secs*bytes
530 {******************************************************************************
531 --- Findfirst FindNext ---
532 ******************************************************************************}
534 { Needed kernel calls }
536 function FindFirstFile (lpFileName: PChar; var lpFindFileData: TWIN32FindData): THandle;
537 external 'kernel32
' name 'FindFirstFileA
';
538 function FindNextFile (hFindFile: THandle; var lpFindFileData: TWIN32FindData): LongBool;
539 external 'kernel32
' name 'FindNextFileA
';
540 function FindCloseFile (hFindFile: THandle): LongBool;
541 external 'kernel32
' name 'FindClose
';
543 Procedure StringToPchar (Var S : String);
551 Procedure PCharToString (Var S : String);
554 L:=strlen(pchar(@S[0]));
560 procedure FindMatch(var f:searchrec);
562 { Find file with correct attribute }
563 While (F.W32FindData.dwFileAttributes and F.ExcludeAttr)<>0 do
565 if not FindNextFile (F.FindHandle,F.W32FindData) then
567 DosError:=Last2DosError(GetLastError);
571 { Convert some attributes back }
572 f.size:=F.W32FindData.NFileSizeLow;
573 f.attr:=WinToDosAttr(F.W32FindData.dwFileAttributes);
574 WinToDosTime(F.W32FindData.ftLastWriteTime,f.Time);
575 f.Name:=StrPas(@F.W32FindData.cFileName);
579 procedure findfirst(const path : pathstr;attr : word;var f : searchRec);
585 F.ExcludeAttr:=(not Attr) and ($1e); {hidden,sys,dir,volume}
586 StringToPchar(f.name);
587 { FindFirstFile is a Win32 Call }
588 F.FindHandle:=FindFirstFile (pchar(@f.Name),F.W32FindData);
589 If longint(F.FindHandle)=Invalid_Handle_value then
591 DosError:=Last2DosError(GetLastError);
594 { Find file with correct attribute }
599 procedure findnext(var f : searchRec);
603 if not FindNextFile (F.FindHandle,F.W32FindData) then
605 DosError:=Last2DosError(GetLastError);
608 { Find file with correct attribute }
613 procedure swapvectors;
618 Procedure FindClose(Var f: SearchRec);
621 If longint(F.FindHandle)<>Invalid_Handle_value then
623 if not FindCloseFile(F.FindHandle) then
625 DosError:=Last2DosError(GetLastError);
632 {******************************************************************************
634 ******************************************************************************}
636 function GetFileTime(h : longint;creation,lastaccess,lastwrite : PFileTime) : longbool;
637 external 'kernel32
' name 'GetFileTime
';
638 function SetFileTime(h : longint;creation,lastaccess,lastwrite : PFileTime) : longbool;
639 external 'kernel32
' name 'SetFileTime
';
640 function SetFileAttributes(lpFileName : pchar;dwFileAttributes : longint) : longbool;
641 external 'kernel32
' name 'SetFileAttributesA
';
642 function GetFileAttributes(lpFileName : pchar) : longint;
643 external 'kernel32
' name 'GetFileAttributesA
';
645 procedure fsplit(path : pathstr;var dir : dirstr;var name : namestr;var ext : extstr);
647 dotpos,p1,i : longint;
649 { allow slash as backslash }
650 for i:=1 to length(path) do
651 if path[i]='/' then path[i]:='\';
661 { split the path
and the name
, there are no more path informtions
}
662 { if path contains no backslashes
}
668 dir:=dir+copy(path,1,p1);
671 { try to find out a extension }
677 If (Path[i]='.') Then
684 Ext:=Copy(Path,DotPos,255);
685 Name:=Copy(Path,1,DotPos - 1);
690 function GetFullPathName(lpFileName: PChar; nBufferLength: Longint; lpBuffer: PChar; var lpFilePart : PChar):DWORD;
691 external 'kernel32
' name 'GetFullPathNameA
';
693 function GetShortPathName(lpszLongPath:pchar; lpszShortPath:pchar; cchBuffer:DWORD):DWORD;
694 external 'kernel32
' name 'GetShortPathNameA
';
696 function FExpand(const path : pathstr) : pathstr;
697 var value : Array[0..255] of char;
702 { if path is empty then return the current dir }
707 { allow slash as backslash }
708 for i:=1 to length(p) do
713 fillchar(value
,sizeof(value
),0);
714 GetFullPathName(@p, 255, value
, tmp
);
715 FExpand
:= strpas(value
);
718 function
SearchPath(lpPath
: PChar
; lpFileName
: PChar
; lpExtension
: PChar
; nBufferLength
: Longint
; lpBuffer
: PChar
;
719 var lpFilePart
: PChar
) : Longint
; external
'kernel32' name
'SearchPathA';
721 Function
FSearch(path
: pathstr
; dirlist
: string
): pathstr
;
723 value
: Array
[0..255] of char
;
732 { check
if the file specified exists
}
733 findfirst(path
,anyfile
,s
);
743 for i
:=1 to
length(path
) do
746 fsplit(path,dir,name,ext);
747 for i:=1 to length(dirlist) do
748 if dirlist[i]='/' then
750 { allow slash as backslash
}
755 if SearchPath(@dir, @name, @ext, 255, @value, temp
)>0 then
757 fsearch
:= strpas(value
);
776 dir2
:=Copy(dirlist
,1,i-1
);
777 dirlist
:=Copy(dirlist
,i
+1,255);
779 { don
't add anything if dir2 is empty string }
781 lastchar:=dir2[length(dir2)]
784 if (lastchar
<>'\') and (lastchar<>':') then
789 if SearchPath(@dir2, @name, @ext, 255, @value, temp
)>0 then
791 fsearch
:= strpas(value
);
800 procedure
getftime(var f
;var time
: longint
);
804 if GetFileTime(filerec(f
).Handle
,nil,nil,@ft) and
805 WinToDosTime(ft
,time
) then
809 DosError
:=Last2DosError(GetLastError
);
815 procedure
setftime(var f
;time
: longint
);
819 if DosToWinTime(time
,ft
) and
820 SetFileTime(filerec(f
).Handle
,nil,nil,@ft) then
823 DosError
:=Last2DosError(GetLastError
);
827 procedure
getfattr(var f
;var attr
: word
);
832 l
:=GetFileAttributes(filerec(f
).name
);
835 DosError
:=Last2DosError(GetLastError
);
843 procedure
setfattr(var f
;attr
: word
);
846 if not(SetFileAttributes(filerec(f
).name
,attr
)) then
847 DosError
:=Last2DosError(GetLastError
);
850 { change to short filename
if successful win32 call PM
}
851 function
GetShortName(var p
: String
) : boolean
;
853 buffer
: array
[0..255] of char
;
856 {we can
't mess with p, because we have to return it if call is
859 if Length(p)>0 then {copy p to array of char}
860 move(p[1],buffer[0],length(p));
861 buffer[length(p)]:=chr(0);
863 {Should return value load loaddoserror?}
865 ret:=GetShortPathName(@buffer,@buffer,255);
872 DosError:=Last2DosError(GetLastError);
873 GetShortName:=ret<>0;
877 { change to long filename if successful DOS call PM }
878 function GetLongName(var p : String) : boolean;
880 lfn,sfn : array[0..255] of char;
884 {contrary to shortname, SDK does not mention input buffer can be equal
887 if Length(p)>0 then {copy p to array of char}
888 move(p[1],sfn[0],length(p));
889 sfn[length(p)]:=chr(0);
890 fillchar(lfn,sizeof(lfn),#0);
893 {Should return value load loaddoserror?}
895 ret:=GetFullPathName(@sfn,255,@lfn,filename);
899 p:=strpas(lfn); {lfn here returns full path, filename only fn}
902 DosError:=Last2DosError(GetLastError);
906 {******************************************************************************
908 ******************************************************************************}
911 The environment is a block of zero terminated strings
915 function GetEnvironmentStrings : pchar;
916 external 'kernel32
' name 'GetEnvironmentStringsA
';
917 function FreeEnvironmentStrings(p : pchar) : longbool;
918 external 'kernel32
' name 'FreeEnvironmentStringsA
';
920 function envcount : longint;
925 p:=GetEnvironmentStrings;
934 FreeEnvironmentStrings(p);
939 Function EnvStr(index: integer): string;
944 { envcount takes some time in win32 }
948 if (index<=0) or (index>count) then
953 p:=GetEnvironmentStrings;
956 { retrive the string with the given index }
961 FreeEnvironmentStrings(p);
965 Function GetEnv(envvar: string): string;
972 p:=GetEnvironmentStrings;
978 if upcase(copy(s,1,i-1))=upcase(envvar) then
980 getenv:=copy(s,i+1,length(s)-i);
986 FreeEnvironmentStrings(p);
990 {******************************************************************************
991 --- Not Supported ---
992 ******************************************************************************}
994 Procedure keep(exitcode : word);
998 Procedure getintvec(intno : byte;var vector : pointer);
1002 Procedure setintvec(intno : byte;vector : pointer);
1007 function FreeLibrary(hLibModule : THANDLE) : longbool;
1008 external 'kernel32
' name 'FreeLibrary
';
1009 function GetVersionEx(var VersionInformation:OSVERSIONINFO) : longbool;
1010 external 'kernel32
' name 'GetVersionExA
';
1011 function LoadLibrary(lpLibFileName : pchar):THandle;
1012 external 'kernel32
' name 'LoadLibraryA
';
1013 function GetProcAddress(hModule : THandle;lpProcName : pchar) : pointer;
1014 external 'kernel32
' name 'GetProcAddress
';
1018 versioninfo.dwOSVersionInfoSize:=sizeof(versioninfo);
1019 GetVersionEx(versioninfo);
1021 GetDiskFreeSpaceEx:=nil;
1022 if ((versioninfo.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS) and
1023 (versioninfo.dwBuildNUmber>=1000)) or
1024 (versioninfo.dwPlatformId=VER_PLATFORM_WIN32_NT) then
1026 kernel32dll:=LoadLibrary('kernel32
');
1027 if kernel32dll<>0 then
1028 GetDiskFreeSpaceEx:=TGetDiskFreeSpaceEx(GetProcAddress(kernel32dll,'GetDiskFreeSpaceExA
'));
1032 if kernel32dll<>0 then
1033 FreeLibrary(kernel32dll);
1038 Revision 1.1 2002/02/19 08:26:23 sasu
1041 Revision 1.1.2.5 2000/09/06 20:46:19 peter
1042 * removed previous fsplit() patch as it's
not the correct behaviour
for
1043 LFNs
. The code showing the bug could easily be adapted
1045 Revision
1.1.2.4 2000/09/04 20:15:22 peter
1046 * fixed previous commit
1048 Revision
1.1.2.3 2000/09/04 19:36:25 peter
1049 * fsplit with
.. fix from Thomas
1051 Revision
1.1.2.1 2000/08/02 19:30:07 peter
1052 * doserror setting fixes
1054 Revision
1.1 2000/07/13 06:31:19 michael
1057 Revision
1.37 2000/05/26 12:03:13 marco
1058 * added getlongname
and getshortname
1060 Revision
1.36 2000/05/19 13:20:37 pierre
1061 * avoid some Range Check errors
1063 Revision
1.35 2000/04/17 20:43:27 pierre
1064 fix bug
902 for win32
and linux
1066 Revision
1.34 2000/02/26 13:24:26 peter
1067 * fixed fexpand with empty argument to
return current dir
1069 Revision
1.33 2000/02/09 16:59:34 peter
1072 Revision
1.32 2000/02/02 17:32:59 pierre
1073 * use int64 typecast
in diskfree
and disksize
1075 Revision
1.31 2000/01/24 21:57:56 florian
1076 * disksize
/diskfree
return now a int64
1078 Revision
1.30 2000/01/11 13:45:19 pierre
1079 * fsearch was still worng
for multiple pathes
1081 Revision
1.29 2000/01/11 12:49:26 pierre
1082 * fsearch bugs
and fexpand memory leak fixed
1084 Revision
1.28 2000/01/07 16:41:52 daniel
1087 Revision
1.27 2000/01/07 16:32:34 daniel
1088 * copyright
2000 added
1090 Revision
1.26 1999/11/18 15:28:47 michael
1091 * Better
and faster Fexpand
, SearchPath fromPiotr Sawicki
1093 Revision
1.25 1999/10/14 08:57:51 peter
1094 * getfattr resets doserror
1096 Revision
1.24 1999/10/12 08:56:48 pierre
1099 Revision
1.23 1999/09/22 12:34:05 pierre
1100 ExecInheritsHandles reset to
false by default
1102 Revision
1.22 1999/09/21 13:24:32 pierre
1105 Revision
1.21 1999/09/21 12:37:09 pierre
1106 * Child inherits now file handles from parent
in Exec by default
1108 Revision
1.20 1999/09/21 11:34:40 pierre
1109 + ExecInheritedHandles boolean
1111 Revision
1.19 1999/08/25 13:57:55 michael
1112 + Patched FSearch from Frank McCormick
1114 Revision
1.18 1999/08/12 09:24:14 michael
1115 Fixed win32finddata size
; searchrec
.excludeattr was overwritten
.