Как "не заходить" в папку в WFX?
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Написание плагинов для Total Commander

#1: Как "не заходить" в папку в WFX? Author: D1PLocation: Тбилиси PostPosted: Mon Jan 17, 2005 17:10
    —
Цитата из справки по написанию WFX:
Quote:
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) не помогает - т.к. тотал в таком случае в папку заходит

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

#2:  Author: Vadim YuryshevLocation: Odessa PostPosted: Mon Jan 17, 2005 20:45
    —
В FsFindFirst сделать return INVALID_HANDLE_VALUE не пробовал?

#3:  Author: D1PLocation: Тбилиси PostPosted: Mon Jan 17, 2005 22:48
    —
Пробовал. Результат плачевный - сыплются ошибки при заходе в эту папку.

#4:  Author: SCHMasterLocation: Киев PostPosted: Tue Jan 18, 2005 03:20
    —
D1P
Quote:
Результат плачевный - сыплются ошибки при заходе в эту папку.

Какие ошибки? ТС может просто "ругнуться", выдав звуковое сообщение. Подругому ты никак не сделаешь.

#5:  Author: D1PLocation: Тбилиси PostPosted: Tue Jan 18, 2005 15:15
    —
Чаще всего выдаётся обычная ошибка External Exception EEDFADE, что мне ни о чём не говорит - под отладчиком всё идёт как и должно быть. По-моему, пару раз тотал вылетал вобще без всякого месаджа - сказать точно не могу.
Фишка в том, что иногда ошибка появляется, иногда нет - но если даже и не появляется - то в папку тотал всё равно заходит.
Ну, если никто с таким не сталкивался, буду сам мучаться - наверняка это я чего-то неправильно сделал.

#6:  Author: Shaman PostPosted: Tue Jan 18, 2005 23:25
    —
Поговори с создателем Startup Guard я в него не могу зайти но он есть =)

#7:  Author: _ElzorLocation: Орск PostPosted: Wed Aug 31, 2005 16:48
    —
Думаю что уже не актуально, но тем не менее...
Code:

::SetLastError(0);
return INVALID_HANDLE_VALUE;

#8: Total не заходит в пустую папку при использовании WideString Author: bookmistLocation: Петербург PostPosted: Sat May 06, 2006 16:00
    —
Пишу плагин менеджер библиотеки, и столкнулся со странной проблемой. Тотал то заходил в пустые папки в плагине, то ругался и не заходил. Попытавшись локализовать ошибку пришёл к абсурдному варианту.
Code:

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.


Оригинальная функция из моего плагина:
Code:

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)

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



Total Commander -> Написание плагинов для Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group