View previous topic :: View next topic |
Author |
Message |
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Mon Jan 17, 2005 17:10 Post subject: Как "не заходить" в папку в WFX? |
|
|
Цитата из справки по написанию 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 |
|
|
Vadim Yuryshev
Joined: 28 Dec 2004 Posts: 5 Location: Odessa
|
(Separately) Posted: Mon Jan 17, 2005 20:45 Post subject: |
|
|
В FsFindFirst сделать return INVALID_HANDLE_VALUE не пробовал? |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Mon Jan 17, 2005 22:48 Post subject: |
|
|
Пробовал. Результат плачевный - сыплются ошибки при заходе в эту папку. |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Tue Jan 18, 2005 03:20 Post subject: |
|
|
D1P
Quote: | Результат плачевный - сыплются ошибки при заходе в эту папку. |
Какие ошибки? ТС может просто "ругнуться", выдав звуковое сообщение. Подругому ты никак не сделаешь. |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Tue Jan 18, 2005 15:15 Post subject: |
|
|
Чаще всего выдаётся обычная ошибка External Exception EEDFADE, что мне ни о чём не говорит - под отладчиком всё идёт как и должно быть. По-моему, пару раз тотал вылетал вобще без всякого месаджа - сказать точно не могу.
Фишка в том, что иногда ошибка появляется, иногда нет - но если даже и не появляется - то в папку тотал всё равно заходит.
Ну, если никто с таким не сталкивался, буду сам мучаться - наверняка это я чего-то неправильно сделал. |
|
Back to top |
|
|
Shaman
Joined: 11 Jan 2005 Posts: 32
|
(Separately) Posted: Tue Jan 18, 2005 23:25 Post subject: |
|
|
Поговори с создателем Startup Guard я в него не могу зайти но он есть =) |
|
Back to top |
|
|
_Elzor
Joined: 31 Aug 2005 Posts: 33 Location: Орск
|
(Separately) Posted: Wed Aug 31, 2005 16:48 Post subject: |
|
|
Думаю что уже не актуально, но тем не менее...
Code: |
::SetLastError(0);
return INVALID_HANDLE_VALUE;
|
|
|
Back to top |
|
|
bookmist
Joined: 18 Nov 2005 Posts: 56 Location: Петербург
|
(Separately) Posted: Sat May 06, 2006 16:00 Post subject: Total не заходит в пустую папку при использовании WideString |
|
|
Пишу плагин менеджер библиотеки, и столкнулся со странной проблемой. Тотал то заходил в пустые папки в плагине, то ругался и не заходил. Попытавшись локализовать ошибку пришёл к абсурдному варианту.
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 |
|
|
bookmist
Joined: 18 Nov 2005 Posts: 56 Location: Петербург
|
(Separately) Posted: Tue May 16, 2006 15:48 Post subject: |
|
|
Проблема частично решилась. Оказалось, что WideString после использования надо обязательно освобождать(присваивать пустую строку). В исходной функции WideString получался при преобразовании типов и строку было не освободить. Сделал sqlreq:WideString и присвоил ей в конце пустую строку и всё заработало правильно. |
|
Back to top |
|
|
|