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

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

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

Сообщение 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) не помогает - т.к. тотал в таком случае в папку заходит

Может кто поможет советом, а то в голову ничего не приходит.
Vadim Yuryshev
Сообщения: 5
Зарегистрирован: Вт дек 28, 2004 22:04
Откуда: Odessa

Сообщение Vadim Yuryshev »

В FsFindFirst сделать return INVALID_HANDLE_VALUE не пробовал?
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Пробовал. Результат плачевный - сыплются ошибки при заходе в эту папку.
Аватара пользователя
SCHMaster
Сообщения: 296
Зарегистрирован: Ср дек 15, 2004 02:32
Откуда: Киев
Контактная информация:

Сообщение SCHMaster »

D1P
Результат плачевный - сыплются ошибки при заходе в эту папку.
Какие ошибки? ТС может просто "ругнуться", выдав звуковое сообщение. Подругому ты никак не сделаешь.
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Чаще всего выдаётся обычная ошибка External Exception EEDFADE, что мне ни о чём не говорит - под отладчиком всё идёт как и должно быть. По-моему, пару раз тотал вылетал вобще без всякого месаджа - сказать точно не могу.
Фишка в том, что иногда ошибка появляется, иногда нет - но если даже и не появляется - то в папку тотал всё равно заходит.
Ну, если никто с таким не сталкивался, буду сам мучаться - наверняка это я чего-то неправильно сделал.
Shaman
Сообщения: 32
Зарегистрирован: Вт янв 11, 2005 11:06

Сообщение Shaman »

Поговори с создателем Startup Guard я в него не могу зайти но он есть =)
_Elzor
Сообщения: 33
Зарегистрирован: Ср авг 31, 2005 13:42
Откуда: Орск

Сообщение _Elzor »

Думаю что уже не актуально, но тем не менее...

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

::SetLastError(0);
return INVALID_HANDLE_VALUE;
bookmist
Сообщения: 56
Зарегистрирован: Пт ноя 18, 2005 18:05
Откуда: Петербург

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

Сообщение 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)
bookmist
Сообщения: 56
Зарегистрирован: Пт ноя 18, 2005 18:05
Откуда: Петербург

Сообщение bookmist »

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