
01.03.2011, 13:09
|
Начинающий
|
|
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
|
|
Поиск файлов и dll
Здравствуйте!
Появилась проблемка написал алгоритм поиска файлов и папок, разрабатывал его на форме - все работало нормально... стал переносить в dll выдовало ошибку "Exports allowed only at global scope", но с этой проблемой вроде как разобрался. Далее в чем беда - код компилируется нормально, но вернуть значение не удается... Может кто глянет и поймет где я накосячил...
Код:
library Project2;
uses
SysUtils,
Classes;
procedure Research(LBitem:Integer; sName:String); forward;
var
SL1,SL2,SL3:TStringList;
{$R *.res}
function RuLowerCase(const S: string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
L := Length(S);
SetLength(Result, L);
Source := Pointer(S);
Dest := Pointer(Result);
while L <> 0 do
begin
Ch := Source^;
if ((Ch >= 'A') and (Ch <= 'Z')) or ((Ch >= 'А') and (Ch <= 'Я')) then Inc(Ch, 32);
Dest^ := Ch;
Inc(Source);
Inc(Dest);
Dec(L);
end;
end;
function SLCrtDes(CnD:boolean):boolean;
begin
if CnD = true then
begin
SL1:=TStringList.Create;
SL2:=TStringList.Create;
SL3:=TStringList.Create;
Sl1.Clear;
Sl2.Clear;
Sl3.Clear;
end else begin
SL1.Destroy;
SL2.Destroy;
SL3.Destroy;
end;
end;
function DirOrNot(iItem: String):boolean;
var i,j: integer;
begin
DirOrNot:=true;
for i:=1 to Length(iItem) do
begin
if iItem[i] = '.' then DirOrNot:=false;
end;
end;
function FDSearch(inDir,Fname:String; Attribut,iStart:Integer):ShortString export; stdcall;
var
F: TSearchRec;
Path, sDir: string;
Attr,i: Integer;
begin
SLCrtDes(true); //Создание StringList (SL1,2,3)
Path := inDir + '\*.*';
FindFirst(Path, Attribut, F);
if F.name <> '' then
begin
if DirOrNot(F.name) = true then SL1.Add(inDir+'\'+F.name) //DirOrNot провека папка или файл
else if (F.Name<>'.') and (F.Name<>'..') then
begin SL2.Add(F.name);
SL3.Add(inDir+'\'+F.name);
end;
while FindNext(F) = 0 do
begin
if DirOrNot(F.name) = true then SL1.Add(inDir+'\'+F.name)
else if (F.Name<>'.') and (F.Name<>'..') then
begin SL2.Add(F.name);
SL3.Add(inDir+'\'+F.name);
end;
end;
end;
FindClose(F);
//до этого места работает
if iStart <= SL1.Count-1 then Research(iStart,Fname)
else begin
for i:=0 to SL2.Count-1 do
begin
if RuLowerCase(Fname)=RuLowerCase(SL2.Strings[i]) then
begin
FDSearch:=SL3.Strings[i];
end;
end;
end;
end;
procedure Research(LBitem:Integer; sName:String);
var NextDir:String;
begin
NextDir:=SL1.Strings[LBitem];
FDSearch(NextDir,sName,faReadOnly + faArchive + faDirectory,LBitem+1);
end;
exports FDSearch name 'FDSearch';
begin
end.
Заранее Спасибо!
|