Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.03.2011, 13:09
Janom Janom вне форума
Начинающий
 
Регистрация: 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.

Заранее Спасибо!
Ответить с цитированием
  #2  
Старый 01.03.2011, 14:52
mss mss вне форума
Новичок
 
Регистрация: 29.10.2010
Сообщения: 50
Репутация: 10
По умолчанию

А что, воспользоваться встроенным отладчиком для самоcтоятельного поиска своих косяков не судьба ?
Ответить с цитированием
  #3  
Старый 01.03.2011, 15:54
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Спасибо за совет, к сожалению или к счастью уже допер... проблема в пересоздании SL1,2,3 заключалась...
Ответить с цитированием
  #4  
Старый 02.03.2011, 09:35
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

вот решил выложить код с исправленным вариантом...
Код:
...
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';
...
P.S. нужно иногда и "покурить" сходить, а то что-то тупить начинаешь по страшному... вплоть до переполнения стека...

Последний раз редактировалось Janom, 02.03.2011 в 10:22.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:41.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025