Страница 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 и присвоил ей в конце пустую строку и всё заработало правильно.