[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]
unit lfn;
{
This unit allows a Windows 3.x program to access Windows 95
long file names. Use the LFNFindFirst and LFNFindNext like
you would use the corresponding ones for normal file names.
The only two differences you should note:
1. The path is a standard Pascal string, not asciiz.
2. These are functions, they return an error code value.
Codes are standard except 99: o/s not lfn capable.
Constants LFNAble and WinVersion are available for the
host application to consult. The major version is held
in the low-order byte with the minor version in the
high-order byte of WinVersion.
Be sure to LFNFindClose when you have completed the operation.
credits:
Duncan Murdoch - assembler code for LFNFindFirst, LFNFindNext
and LFNFindClose.
Michael Feltz - logic to check windows version and return error
if long file names are not supported, conversion
to a Pascal unit.
}
Interface
uses winprocs;
type
TLFNSearchRec = record
attr : longint;
creation : comp;
lastaccess : comp;
lastmod : comp;
highfilesize : longint;
lowfilesize : longint;
reserved : comp;
name : array[0..259] of char;
shortname : array[0..13] of char;
handle : word;
end;
const
faReadOnly = $01;
faHidden = $02;
faSysFile = $04;
faVolumeID = $08;
faDirectory = $10;
faArchive = $20;
faAnyFile = $3F;
LFNAble : Boolean = True; {is oper sys long file name able?}
WinVersion : Word = 0; {windows version}
function LFNFindFirst (filespec:string;attr:word;var S:TLFNSearchRec):integer;
function LFNFindNext (var S:TLFNSearchRec):integer;
function LFNFindClose (var S:TLFNSearchRec):integer;
Implementation
function LFNFindFirst(filespec:string;attr:word;var S:TLFNSearchRec):integer;
begin
If LFNAble then
begin
filespec := filespec + #0;
S.attr := attr;
asm
push ds
push ss
pop ds
lea dx,filespec+1
les di,S
mov ax,$714e
mov cx,attr
mov si,0
int $21
les di,S
mov word ptr es:[di+TLFNSearchRec.handle], ax
jc @1
xor ax,ax
@1:
mov @result,ax
pop ds
end; {asm}
end {if}
else
LFNFindFirst := 99;
end; {function}
function LFNFindNext(var S:TLFNSearchRec):integer;
begin
If LFNAble then
asm
mov ax,$714f
mov si,0
les di,S
mov bx,word ptr es:[di+TLFNSearchRec.Handle]
int $21
jc @1
xor ax,ax
@1:
mov @result,ax
end {asm}
else
LFNFindNext := 99;
end; {function}
function LFNFindClose(var S:TLFNSearchRec):integer;
begin
If LFNAble then
asm
mov ax,$71a1
les di,S
mov bx,word ptr es:[di+TLFNSearchRec.Handle]
int $21
jc @1
xor ax,ax
@1:
mov @result,ax
end {asm}
else
LFNFindClose := 99;
end; {function}
begin
WinVersion := LoWord(GetVersion);
If ((Lo(WinVersion) = 3) and {windows 95 first}
(Hi(WinVersion) < 95)) or {version is 3.95 }
(Lo(WinVersion) < 3) then LFNAble := False;
end. {unit}
[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]