![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Появилась проблемка написал алгоритм поиска файлов и папок, разрабатывал его на форме - все работало нормально... стал переносить в 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.Заранее Спасибо! |
|
#2
|
|||
|
|||
|
А что, воспользоваться встроенным отладчиком для самоcтоятельного поиска своих косяков не судьба ?
|
|
#3
|
|||
|
|||
|
Спасибо за совет, к сожалению или к счастью уже допер... проблема в пересоздании SL1,2,3 заключалась...
|
|
#4
|
|||
|
|||
|
вот решил выложить код с исправленным вариантом...
Код:
...
function FDSearch(inDir:String; iStart:Integer):boolean;
var
F: TSearchRec;
Path: string;
begin
repeat
if iStart>-1 then inDir:=SL1.Strings[iStart];
Path := inDir + '\*.*';
FindFirst(Path, faAnyFile, F);
if F.name <> '' then
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;
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);
iStart:=iStart+1;
until iStart > SL1.Count-1;
end;
function Search(dDir,dName:String):ShortString export; stdcall;
var i:integer;
begin
SLCrtDes(true);
FDSearch(dDir,-1);
for i:=0 to SL2.Count-1 do
begin
if RuLowerCase(dName)=RuLowerCase(SL2.Strings[i]) then
begin
Search:=SL3.Strings[i];
end;
end;
SLCrtDes(false);
end;
exports Search name 'Search';
...Последний раз редактировалось Janom, 02.03.2011 в 10:22. |