home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 March
/
Chip_2002-03_cd1.bin
/
zkuste
/
delphi
/
kompon
/
d5
/
cak
/
CAKDIR.ZIP
/
Links.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-04-23
|
4KB
|
156 lines
unit Links;
interface
function SpecialDirectory(ID: integer): string;
function CreateFolder(Foldername: string): boolean;
function CreateLink(lpszPathObj, lpszPathLink, lpszDesc: string): boolean;
function Like(const AString, APattern: string): boolean;
implementation
uses Windows, SysUtils, ShellApi, ActiveX, ComObj, ShlObj;
const
IID_IPersistFile: TGUID = (D1: $0000010B; D2: $0000; D3: $0000;
D4: ($C0, $00, $00, $00, $00, $00, $00, $46));
function SpecialDirectory(ID: integer): string;
var
pidl: PItemIDList;
Path: PChar;
begin
if SUCCEEDED(SHGetSpecialFolderLocation(0, ID, pidl)) then
begin
Path := StrAlloc(MAX_PATH);
SHGetPathFromIDList(pidl, Path);
Result := string(Path);
if Result[length(Result)] <> '\' then
Result := Result + '\';
end;
end; {SpecialDirectory}
function CreateFolder(Foldername: string): boolean;
begin
Result := False;
SetLastError(0);
CreateDirectory(PChar(Foldername), nil);
if (GetLastError() = 0) or (GetLastError() = ERROR_ALREADY_EXISTS) then
Result := True;
end; {CreateFolder}
function CreateLink(lpszPathObj, lpszPathLink, lpszDesc: string): boolean;
var
psl: IShellLink;
ppf: IPersistFile;
begin
Result := False;
if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
IID_IShellLinkA, psl)) then
begin
psl.SetPath(PChar(lpszPathObj));
psl.SetDescription(PChar(lpszDesc));
if SUCCEEDED(psl.QueryInterface(IID_IPersistFile, ppf)) then
begin
ppf.Save(StringToOLEStr(lpszPathLink), True);
Result := True;
end;
end;
end; {CreateLink}
function Like(const AString, APattern: string): boolean;
var
StringPtr, PatternPtr: PChar;
StringRes, PatternRes: PChar;
begin
Result := False;
StringPtr := PChar(AnsiLowerCase(AString));
PatternPtr := PChar(AnsiLowerCase(APattern));
StringRes := nil;
PatternRes := nil;
repeat
repeat // ohne vorangegangenes "*"
case PatternPtr^ of
#0:
begin
Result := StringPtr^ = #0;
if Result or (StringRes = nil) or (PatternRes = nil) then
Exit;
StringPtr := StringRes;
PatternPtr := PatternRes;
Break;
end;
'*':
begin
inc(PatternPtr);
PatternRes := PatternPtr;
Break;
end;
'?':
begin
if StringPtr^ = #0 then
Exit;
inc(StringPtr);
inc(PatternPtr);
end;
else
begin
if StringPtr^ = #0 then
Exit;
if StringPtr^ <> PatternPtr^ then
begin
if (StringRes = nil) or (PatternRes = nil) then
Exit;
StringPtr := StringRes;
PatternPtr := PatternRes;
Break;
end
else
begin
inc(StringPtr);
inc(PatternPtr);
end;
end;
end;
until False;
repeat // mit vorangegangenem "*"
case PatternPtr^ of
#0:
begin
Result := True;
Exit;
end;
'*':
begin
inc(PatternPtr);
PatternRes := PatternPtr;
end;
'?':
begin
if StringPtr^ = #0 then
Exit;
inc(StringPtr);
inc(PatternPtr);
end;
else
begin
repeat
if StringPtr^ = #0 then
Exit;
if StringPtr^ = PatternPtr^ then
Break;
inc(StringPtr);
until False;
inc(StringPtr);
StringRes := StringPtr;
inc(PatternPtr);
Break;
end;
end;
until False;
until False;
end; {Michael Winter}
end.