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 

Почему я вижу только первые символы строк?

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



Joined: 15 Jan 2009
Posts: 4

Post (Separately) Posted: Thu Jan 15, 2009 06:24    Post subject: Почему я вижу только первые символы строк? Reply with quote

Вот взятый код отсюда
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


Подключаю плагин к тоталу, вижу только первые символы…
Code:

1
2
3

В чём проблема? Использую версию тотала 7.02, а версию Delphi 2009. Может это из-за юникода, или проблемы искать в чём-то другом?
Back to top
View user's profile Send private message
D1P



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

Post (Separately) Posted: Thu Jan 15, 2009 08:59    Post subject: Reply with quote

fspl wrote:
Может это из-за юникода, или проблемы искать в чём-то другом?

Именно.
Под D2009 плагин ведёт себя именно так, при сборке под D2007 - работает, как и должно.
Поддержка юникодных плагинов есть в TC 7.50 (очень скоро должна быть публичная бета), новое плагиновое API будет иметь аналоги основных функций для работы с юникодом (FsFindFirstW, FsFindNextW, например).[/quote]
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message
fspl



Joined: 15 Jan 2009
Posts: 4

Post (Separately) Posted: Thu Jan 15, 2009 22:04    Post subject: Reply with quote

Неужели нет вариантов??? Shocked
Back to top
View user's profile Send private message
D1P



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

Post (Separately) Posted: Fri Jan 16, 2009 13:17    Post subject: Reply with quote

fspl wrote:
Неужели нет вариантов???

Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Fri Jan 16, 2009 13:33    Post subject: Reply with quote

А что, Дельфи не умеет перекодировать юникодные строки в неюникодные? Ведь для этого даже WinAPI-функции есть готовые (WideCharToMultiByte). В худшем случае, даже если Дельфи 2009 вообще не поддерживает неюникодных строк как тип данных, ну и ладно, будет это не строка, а байт-массив, какая разница? Всё равно единственное, что с ним требуется делать — это загнать его по адресу, предоставленному Тоталом, а тот уж дальше сам разберётся.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Fri Jan 16, 2009 13:38    Post subject: Reply with quote

У Дельфи2009 нет ключа принудительной компиляции неюникода как такового?
Back to top
View user's profile Send private message
D1P



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

Post (Separately) Posted: Fri Jan 16, 2009 14:18    Post subject: Reply with quote

CaptainFlint wrote:
А что, Дельфи не умеет перекодировать юникодные строки в неюникодные?

Без понятия, я 2009 поковырял и бросил - слишком много проблем при портировании старых проектов.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message
fspl



Joined: 15 Jan 2009
Posts: 4

Post (Separately) Posted: Sat Jan 17, 2009 02:34    Post subject: Reply with quote

D1P wrote:
fspl wrote:
Неужели нет вариантов???

Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь.


Вообще конечно вариант, и 2006 версия делфи у меня тоже установлена. Только вот хочется уже полностью на 2009 перейти.
Конечно, 2009 версия поддерживает AnsiChar, и есть функции, даже стандартные для перекодирования. Я пробовал всё делать на анси, но ничего не выходит…
Back to top
View user's profile Send private message
fspl



Joined: 15 Jan 2009
Posts: 4

Post (Separately) Posted: Thu Jan 22, 2009 00:44    Post subject: Reply with quote

Проблема решена! Wink
Всё дело в том что, к примеру функция 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
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