Страница 1 из 1

Как "не заходить" в папку в WFX?

Добавлено: Пн янв 17, 2005 16:10
D1P
Цитата из справки по написанию WFX:
When an error occurs, call SetLastError() to set the reason of the error. Total Commander checks for the following two errors:

1. ERROR_NO_MORE_FILES: The directory exists, but it's empty (Wincmd can open it, e.g. to copy files to it)
2. Any other error: The directory does not exist, and Total Commander will not try to open it.
При открытии папки вызываю в FsFindFirst SetLastError(Номер_какой-нибудь_ошибки) - и всё равно, тотал пытается зайти в эту папку и даже вызывает FsFindNext. Т.е. один файл в папке отображается по любому.
Мне же надо, чтобы папка присутствовала в файловой системе плагина, но зайти в неё было нельзя. SetLastError(ERROR_NO_MORE_FILES) не помогает - т.к. тотал в таком случае в папку заходит

Может кто поможет советом, а то в голову ничего не приходит.

Добавлено: Пн янв 17, 2005 19:45
Vadim Yuryshev
В FsFindFirst сделать return INVALID_HANDLE_VALUE не пробовал?

Добавлено: Пн янв 17, 2005 21:48
D1P
Пробовал. Результат плачевный - сыплются ошибки при заходе в эту папку.

Добавлено: Вт янв 18, 2005 02:20
SCHMaster
D1P
Результат плачевный - сыплются ошибки при заходе в эту папку.
Какие ошибки? ТС может просто "ругнуться", выдав звуковое сообщение. Подругому ты никак не сделаешь.

Добавлено: Вт янв 18, 2005 14:15
D1P
Чаще всего выдаётся обычная ошибка External Exception EEDFADE, что мне ни о чём не говорит - под отладчиком всё идёт как и должно быть. По-моему, пару раз тотал вылетал вобще без всякого месаджа - сказать точно не могу.
Фишка в том, что иногда ошибка появляется, иногда нет - но если даже и не появляется - то в папку тотал всё равно заходит.
Ну, если никто с таким не сталкивался, буду сам мучаться - наверняка это я чего-то неправильно сделал.

Добавлено: Вт янв 18, 2005 22:25
Shaman
Поговори с создателем Startup Guard я в него не могу зайти но он есть =)

Добавлено: Ср авг 31, 2005 16:48
_Elzor
Думаю что уже не актуально, но тем не менее...

Код: Выделить всё

::SetLastError(0);
return INVALID_HANDLE_VALUE;

Total не заходит в пустую папку при использовании WideString

Добавлено: Сб май 06, 2006 16:00
bookmist
Пишу плагин менеджер библиотеки, и столкнулся со странной проблемой. Тотал то заходил в пустые папки в плагине, то ругался и не заходил. Попытавшись локализовать ошибку пришёл к абсурдному варианту.

Код: Выделить всё

library MyLib;
{$E wfx}
uses Windows;
type
  TProgressProc=function(PluginNr:integer;SourceName,TargetName:pchar;PercentDone:integer):integer; stdcall;
  TLogProc=procedure(PluginNr,MsgType:integer;LogString:pchar); stdcall;
  TRequestProc=function(PluginNr,RequestType:integer;CustomTitle,CustomText,ReturnedText:pchar;maxlen:integer):bool; stdcall;
function FsInit(PluginNr:integer;pProgressProc:tProgressProc;pLogProc:tLogProc;
                pRequestProc:tRequestProc):integer; stdcall;
begin result:=0; end;

function FsFindFirst(path :pchar;var FindData:tWIN32FINDDATA):thandle; stdcall;
var
 sql_req:widestring;
begin
 sql_req:='_';{Если эта строка выполняеся, то тотал не заходит в плагин}
 SetLastError(ERROR_NO_MORE_FILES);
 result:=INVALID_HANDLE_VALUE;
end;

function FsFindNext(Hdl:thandle;var FindData:tWIN32FINDDATA):bool; stdcall;
begin result:=false; end;

function FsFindClose(Hdl:thandle):integer; stdcall;
begin result:=0; end;

exports
 FsInit, FsFindFirst, FsFindNext, FsFindClose;
end.
Оригинальная функция из моего плагина:

Код: Выделить всё

function FsFindFirst(path :pchar;var FindData:tWIN32FINDDATA):thandle; stdcall;
var
 hdl:TADODataSet;
 sqlreq:string;
begin
 FillChar(FindData,sizeof(FindData),0);
 result:=INVALID_HANDLE_VALUE;
 hdl:=nil;
 try
 sqlreq:=GetSQLrequest(path);
 if sqlreq='' then SetLastError(ERROR_NO_MORE_FILES)
 else begin
  hdl:=TADODataSet.Create(DBConn);
  hdl.Connection:=DBConn;
  hdl.CursorType:=ctOpenForwardOnly;
  hdl.CommandType:=cmdText;
  hdl.CommandText:=sqlreq;{}
  hdl.Active:=True;
  hdl.First;
  if (not hdl.IsEmpty)and(FsFindNext(hdl,FindData)) then result:=cardinal(hdl)
  else begin SetLastError(ERROR_NO_MORE_FILES); hdl.Free;{Плагин не заходит в папку, если выполняется этот код} end;
 end;
 except
  if hdl<>nil then hdl.Free;
  result:=INVALID_HANDLE_VALUE;
 end;
end;
Может кто- нибудь сказать: как проостое использование WideString приводит к таким странным результатам. Причём если присваиваешь sql_req пустую строку, то всё работает нормально.
Пишу на Delphi6, версия TotalCommander 6.54a (16.2.2006)

Добавлено: Вт май 16, 2006 15:48
bookmist
Проблема частично решилась. Оказалось, что WideString после использования надо обязательно освобождать(присваивать пустую строку). В исходной функции WideString получался при преобразовании типов и строку было не освободить. Сделал sqlreq:WideString и присвоил ей в конце пустую строку и всё заработало правильно.