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.
fspl писал(а):Может это из-за юникода, или проблемы искать в чём-то другом?
Именно.
Под D2009 плагин ведёт себя именно так, при сборке под D2007 - работает, как и должно.
Поддержка юникодных плагинов есть в TC 7.50 (очень скоро должна быть публичная бета), новое плагиновое API будет иметь аналоги основных функций для работы с юникодом (FsFindFirstW, FsFindNextW, например).[/quote]
Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь.
А что, Дельфи не умеет перекодировать юникодные строки в неюникодные? Ведь для этого даже WinAPI-функции есть готовые (WideCharToMultiByte). В худшем случае, даже если Дельфи 2009 вообще не поддерживает неюникодных строк как тип данных, ну и ладно, будет это не строка, а байт-массив, какая разница? Всё равно единственное, что с ним требуется делать — это загнать его по адресу, предоставленному Тоталом, а тот уж дальше сам разберётся.
Писать на неюникодной версии дельфи, или подождать TC 7.5. Чем не варианты?
Можно, наверное, работать с неюникодом и в D2009, скорее всего для этого есть какие-то типы. Гугль в помощь.
Вообще конечно вариант, и 2006 версия делфи у меня тоже установлена. Только вот хочется уже полностью на 2009 перейти.
Конечно, 2009 версия поддерживает AnsiChar, и есть функции, даже стандартные для перекодирования. Я пробовал всё делать на анси, но ничего не выходит…
Проблема решена!
Всё дело в том что, к примеру функция 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 на наш!