Страница 1 из 1

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

Добавлено: Чт янв 15, 2009 05:24
fspl
Вот взятый код отсюда
http://www.tckb.ru/index.php?title=%D0% ... and_Delphi

Код: Выделить всё

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

Код: Выделить всё

11111111111111
22222222222222222222
33333333333333333333333
Подключаю плагин к тоталу, вижу только первые символы… В чём проблема? Использую версию тотала 7.02, а версию Delphi 2009. Может это из-за юникода, или проблемы искать в чём-то другом?

Добавлено: Чт янв 15, 2009 07:59
D1P
fspl писал(а):Может это из-за юникода, или проблемы искать в чём-то другом?
Именно.
Под D2009 плагин ведёт себя именно так, при сборке под D2007 - работает, как и должно.
Поддержка юникодных плагинов есть в TC 7.50 (очень скоро должна быть публичная бета), новое плагиновое API будет иметь аналоги основных функций для работы с юникодом (FsFindFirstW, FsFindNextW, например).[/quote]

Добавлено: Чт янв 15, 2009 21:04
fspl
Неужели нет вариантов??? :shock:

Добавлено: Пт янв 16, 2009 12:17
D1P
fspl писал(а):Неужели нет вариантов???
Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь.

Добавлено: Пт янв 16, 2009 12:33
CaptainFlint
А что, Дельфи не умеет перекодировать юникодные строки в неюникодные? Ведь для этого даже WinAPI-функции есть готовые (WideCharToMultiByte). В худшем случае, даже если Дельфи 2009 вообще не поддерживает неюникодных строк как тип данных, ну и ладно, будет это не строка, а байт-массив, какая разница? Всё равно единственное, что с ним требуется делать — это загнать его по адресу, предоставленному Тоталом, а тот уж дальше сам разберётся.

Добавлено: Пт янв 16, 2009 12:38
Worros
У Дельфи2009 нет ключа принудительной компиляции неюникода как такового?

Добавлено: Пт янв 16, 2009 13:18
D1P
CaptainFlint писал(а):А что, Дельфи не умеет перекодировать юникодные строки в неюникодные?
Без понятия, я 2009 поковырял и бросил - слишком много проблем при портировании старых проектов.

Добавлено: Сб янв 17, 2009 01:34
fspl
D1P писал(а):
fspl писал(а):Неужели нет вариантов???
Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь.
Вообще конечно вариант, и 2006 версия делфи у меня тоже установлена. Только вот хочется уже полностью на 2009 перейти.
Конечно, 2009 версия поддерживает AnsiChar, и есть функции, даже стандартные для перекодирования. Я пробовал всё делать на анси, но ничего не выходит…

Добавлено: Ср янв 21, 2009 23:44
fspl
Проблема решена! :wink:
Всё дело в том что, к примеру функция FsFindFirst, получает из плагина переменную типа TWin32FindData, который соответственно в юникодной версии отличается, а вот тотал ждёт ансишную версию этого типа.
Как решается?
Копируем с Delphi 2006 или ниже код этого типа

Код: Выделить всё

_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 на наш!