View previous topic :: View next topic |
Author |
Message |
fspl
Joined: 15 Jan 2009 Posts: 4
|
(Separately) Posted: Thu Jan 15, 2009 06:24 Post subject: Почему я вижу только первые символы строк? |
|
|
Вот взятый код отсюда
http://www.tckb.ru/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F_WFX-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0_%D0%BD%D0%B0_Borland_Delphi
Code: |
library TestPlag;
uses
fsplugin,
SysUtils,
Windows;
var
MainFile:TextFile;
MainFileName:string;
{$E wfx}
{$R *.res}
function FsInit(PluginNr:integer;pProgressProc:tProgressProc;pLogProc:tLogProc;
pRequestProc:tRequestProc):integer; stdcall;
Begin
End;
function FsFindFirst(path :pchar;var FindData:tWIN32FINDDATA):thandle; stdcall;
var
TmpFileName:ShortString;
Begin
Result:=0;
FindData.dwFileAttributes :=0;
FindData.nFileSizeHigh :=0;
FindData.nFileSizeLow :=0;
AssignFile (MainFile,MainFileName);
Reset (MainFile);
if not EOF (MainFile) then
begin
ReadLn(MainFile,TmpFileName);
FindData.nFileSizeLow :=Length(TmpFileName);
StrPCopy (FindData.cFileName,TmpFileName);
end
else
begin
StrPCopy (FindData.cFileName,'No records in text.txt');
end;
End;
function FsFindNext(Hdl:thandle;var FindData:tWIN32FINDDATA):bool; stdcall;
var
TmpFileName:ShortString;
Begin
Result:=True;
if not EOF (MainFile) then
begin
ReadLn (MainFile,TmpFileName);
FindData.dwFileAttributes :=0;
FindData.nFileSizeHigh :=0;
FindData.nFileSizeLow :=Length(TmpFileName);
StrPCopy (FindData.cFileName,TmpFileName);
end
else
result:=False;
End;
function FsFindClose(Hdl:thandle):integer; stdcall;
Begin
CloseFile (MainFile);
end;
function FsPutFile(LocalName,RemoteName:pchar;CopyFlags:integer):integer; stdcall;
Begin
AssignFile (MainFile,MainFileName);
Append (MainFile);
WriteLn (MainFile,ExtractFilename(StrPas(RemoteName)));
CloseFile (MainFile);
Result:=FS_FILE_OK;
End;
function FsGetFile(RemoteName,LocalName:pchar;CopyFlags:integer;RemoteInfo:pRemoteInfo):integer; stdcall;
var
TmpLocalFile:TextFile;
TmpLocalFileName:ShortString;
Begin
TmpLocalFileName:=StrPas (LocalName);
AssignFile (TmpLocalFile,TmpLocalFileName);
Rewrite (TmpLocalFile);
WriteLn (TmpLocalFile,StrPas(RemoteName));
CloseFile (TmpLocalFile);
Result:=FS_FILE_OK;
End;
exports
FsInit,
FsFindFirst,
FsFindNext,
FsFindClose,
FsPutFile,
FsGetFile;
var
PointerPluginFile:pchar;
StrPluginFileName:ShortString;
begin
GetMem (PointerPluginFile,MAX_PATH);
GetModuleFilename (hInstance,PointerPluginFile,MAX_PATH);
StrPluginFileName:=Strpas (PointerPluginFile);
FreeMem (PointerPluginFile);
MainFileName:=ExtractFilePath(StrPluginFileName)+'text.txt';
if not FileExists (MainFileName) then FileCreate (MainFileName);
end.
|
Вот файл text.txt
Code: |
11111111111111
22222222222222222222
33333333333333333333333
|
Подключаю плагин к тоталу, вижу только первые символы…
В чём проблема? Использую версию тотала 7.02, а версию Delphi 2009. Может это из-за юникода, или проблемы искать в чём-то другом? |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Thu Jan 15, 2009 08:59 Post subject: |
|
|
fspl wrote: | Может это из-за юникода, или проблемы искать в чём-то другом? |
Именно.
Под D2009 плагин ведёт себя именно так, при сборке под D2007 - работает, как и должно.
Поддержка юникодных плагинов есть в TC 7.50 (очень скоро должна быть публичная бета), новое плагиновое API будет иметь аналоги основных функций для работы с юникодом (FsFindFirstW, FsFindNextW, например).[/quote] _________________ База знаний о Total Commander
Блог |
|
Back to top |
|
|
fspl
Joined: 15 Jan 2009 Posts: 4
|
(Separately) Posted: Thu Jan 15, 2009 22:04 Post subject: |
|
|
Неужели нет вариантов??? |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Fri Jan 16, 2009 13:17 Post subject: |
|
|
fspl wrote: | Неужели нет вариантов??? |
Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь. _________________ База знаний о Total Commander
Блог |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Fri Jan 16, 2009 13:33 Post subject: |
|
|
А что, Дельфи не умеет перекодировать юникодные строки в неюникодные? Ведь для этого даже WinAPI-функции есть готовые (WideCharToMultiByte). В худшем случае, даже если Дельфи 2009 вообще не поддерживает неюникодных строк как тип данных, ну и ладно, будет это не строка, а байт-массив, какая разница? Всё равно единственное, что с ним требуется делать — это загнать его по адресу, предоставленному Тоталом, а тот уж дальше сам разберётся. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Fri Jan 16, 2009 13:38 Post subject: |
|
|
У Дельфи2009 нет ключа принудительной компиляции неюникода как такового? |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Fri Jan 16, 2009 14:18 Post subject: |
|
|
CaptainFlint wrote: | А что, Дельфи не умеет перекодировать юникодные строки в неюникодные? |
Без понятия, я 2009 поковырял и бросил - слишком много проблем при портировании старых проектов. _________________ База знаний о Total Commander
Блог |
|
Back to top |
|
|
fspl
Joined: 15 Jan 2009 Posts: 4
|
(Separately) Posted: Sat Jan 17, 2009 02:34 Post subject: |
|
|
D1P wrote: | fspl wrote: | Неужели нет вариантов??? |
Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь. |
Вообще конечно вариант, и 2006 версия делфи у меня тоже установлена. Только вот хочется уже полностью на 2009 перейти.
Конечно, 2009 версия поддерживает AnsiChar, и есть функции, даже стандартные для перекодирования. Я пробовал всё делать на анси, но ничего не выходит… |
|
Back to top |
|
|
fspl
Joined: 15 Jan 2009 Posts: 4
|
(Separately) Posted: Thu Jan 22, 2009 00:44 Post subject: |
|
|
Проблема решена!
Всё дело в том что, к примеру функция FsFindFirst, получает из плагина переменную типа TWin32FindData, который соответственно в юникодной версии отличается, а вот тотал ждёт ансишную версию этого типа.
Как решается?
Копируем с Delphi 2006 или ниже код этого типа
Code: |
_WIN32_FIND_DATAA = record
dwFileAttributes: DWORD;
ftCreationTime: TFileTime;
ftLastAccessTime: TFileTime;
ftLastWriteTime: TFileTime;
nFileSizeHigh: DWORD;
nFileSizeLow: DWORD;
dwReserved0: DWORD;
dwReserved1: DWORD;
cFileName: array[0..MAX_PATH - 1] of AnsiChar;
cAlternateFileName: array[0..13] of AnsiChar;
end;
|
Как решается?
Копируем с Delphi 2006 или ниже код этого типа
Переименовываем его, чтобы он не перекрыл тип по умолчанию и меняем тип параметра в функциях FsFindFirst, FsFindNext на наш! |
|
Back to top |
|
|
|
|
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
|