1) Если не планируется поддержка системы плагинов пилота (т.е. не ffi), то можно оставить только fexists(). InitPlugin, DonePlugin и структуры убрать.
2) Момент со строками:
Код
function fexists(patch:string):string; cdecl;
begin
fexists := patch;
end;
заменить на
Код
function fexists(patch:PChar):PChar; cdecl;
begin
fexists := patch;
end;
И сделаю замечание которое убережет от вопросов в дальнейшем.
Код
function fexists(patch:PChar):PChar; cdecl;
var
plugin_str: string;
begin
plugin_str := 'plugin string';
fexists := Addr(plugin_str[1]);
end;
В общем случае это работать не будет. При работе с возвращаемой строкой из пилота будет в лучшем случае падение, в худшем - не правильно работать, т.к. строка будет перезаписана другими функциями и т.п. Если коротко - так делать не надо.
Нельзя возвращать строки из dll.
Решение этой проблемы такое:
Добавляем дополнительную функцию, назовем ее getfilesize(), которая вернет размер файла. Далее в пилоте через ffi создаем строку buff размера, который вернула функция выше + 1. И это строку передаем в функцию dll, например, readfile(path: PChar, buff: PChar):integer; cdecl; В ffi - __cdecl int readfile(const char* path, char* buff);. Которая прочитает нужный файл, а вернет код операции (т.е. 0 - успешно, 1 - файл не найден и т.д. ). Далее, когда buff уже не нужен его нужно освободить так же через ffi.