Здравствуйте, гость ( Вход | Регистрация )

> вопрос по ffi и типы данных
trico
сообщение 27.3.2020, 9:25
Сообщение #1


**

Neophyte
Сообщений: 31
Регистрация: 23.12.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.593
Возраст: 26



Пишу плагин на делфи, с integer разобрался:
Код
local ffi = require("ffi")
local lib = ffi.load("getpix.dll")

ffi.cdef[[
   __cdecl int getpix(int h, int x, int y);
]]


а вот если у меня boolean либо string?? Ну или же своя структура. Как указать это в синтаксисе луа в пилоте?
на __cdecl bool getf(string patch); ругается "declaration specifier expected near 'string'"

нужно обмениваться с длл типами данных string, bollean, array[a,b]. как это должно выглядеть?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Cockney
сообщение 2.4.2020, 12:21
Сообщение #2


********

Master
Сообщений: 1.404
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 22675
Пользователь №: 16.156



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.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения



Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 4.11.2025, 9:15
Designed by Nickostyle