Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Mon Jan 17, 2005 17:10    Post subject: Как "не заходить" в папку в WFX? Reply with quote

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

Может кто поможет советом, а то в голову ничего не приходит.
Back to top
View user's profile Send private message
Vadim Yuryshev



Joined: 28 Dec 2004
Posts: 5
Location: Odessa

Post (Separately) Posted: Mon Jan 17, 2005 20:45    Post subject: Reply with quote

В FsFindFirst сделать return INVALID_HANDLE_VALUE не пробовал?
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Mon Jan 17, 2005 22:48    Post subject: Reply with quote

Пробовал. Результат плачевный - сыплются ошибки при заходе в эту папку.
Back to top
View user's profile Send private message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Tue Jan 18, 2005 03:20    Post subject: Reply with quote

D1P
Quote:
Результат плачевный - сыплются ошибки при заходе в эту папку.

Какие ошибки? ТС может просто "ругнуться", выдав звуковое сообщение. Подругому ты никак не сделаешь.
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Tue Jan 18, 2005 15:15    Post subject: Reply with quote

Чаще всего выдаётся обычная ошибка External Exception EEDFADE, что мне ни о чём не говорит - под отладчиком всё идёт как и должно быть. По-моему, пару раз тотал вылетал вобще без всякого месаджа - сказать точно не могу.
Фишка в том, что иногда ошибка появляется, иногда нет - но если даже и не появляется - то в папку тотал всё равно заходит.
Ну, если никто с таким не сталкивался, буду сам мучаться - наверняка это я чего-то неправильно сделал.
Back to top
View user's profile Send private message
Shaman



Joined: 11 Jan 2005
Posts: 32

Post (Separately) Posted: Tue Jan 18, 2005 23:25    Post subject: Reply with quote

Поговори с создателем Startup Guard я в него не могу зайти но он есть =)
Back to top
View user's profile Send private message
_Elzor



Joined: 31 Aug 2005
Posts: 33
Location: Орск

Post (Separately) Posted: Wed Aug 31, 2005 16:48    Post subject: Reply with quote

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

::SetLastError(0);
return INVALID_HANDLE_VALUE;
Back to top
View user's profile Send private message
bookmist



Joined: 18 Nov 2005
Posts: 56
Location: Петербург

Post (Separately) Posted: Sat May 06, 2006 16:00    Post subject: Total не заходит в пустую папку при использовании WideString Reply with quote

Пишу плагин менеджер библиотеки, и столкнулся со странной проблемой. Тотал то заходил в пустые папки в плагине, то ругался и не заходил. Попытавшись локализовать ошибку пришёл к абсурдному варианту.
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)
Back to top
View user's profile Send private message
bookmist



Joined: 18 Nov 2005
Posts: 56
Location: Петербург

Post (Separately) Posted: Tue May 16, 2006 15:48    Post subject: Reply with quote

Проблема частично решилась. Оказалось, что WideString после использования надо обязательно освобождать(присваивать пустую строку). В исходной функции WideString получался при преобразовании типов и строку было не освободить. Сделал sqlreq:WideString и присвоил ей в конце пустую строку и всё заработало правильно.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group