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

> вопрос по 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
сообщение 28.3.2020, 12:20
Сообщение #2


********

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



Не вижу вызова fexists()
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
trico
сообщение 2.4.2020, 8:33
Сообщение #3


**

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



Цитата(Cockney @ 28.3.2020, 11:20) *

Не вижу вызова fexists()


опечатка. функция вызывается.
Так работает:
пилот

Код

--lua
log("clear")
local ffi = require("ffi")
local file = ffi.load("files.dll")
ffi.cdef[[
    __cdecl int fexists(int patch);
]]
local patch = 55
local t = file.fexists(patch)
log(t)


длл:

Код

library files;

uses
  windows,
  Classes,
  SysUtils;

type
  tInitStruct = packed record
    FunctionCount : Cardinal;
    FunctionNames : Array of Pchar;
  end;

  tParamStruct = packed record
    WindowHandle : Cardinal; // Handle of workWindow
    WindowPID    : Cardinal; // pid of process of workWindow
    Reserved     : Cardinal;
    ParamString     : Pchar; // string of parameters with substituted variables
    ParamStringOrig : Pchar; // original string of parameters
    Result : array [0..32767] of char // array for returned values
  end;

var
  ParamStruct: ^tParamStruct;  // init by UOPilot
  InitStruct :  tInitStruct;   // init by plugin, free on unload

function InitPlugin(App, Scr: integer; Var Version: Real):Pointer; stdcall;
// App: Application.Handle of UOPilot
// Scr: reserved
begin
  // check UOPilot version, if it needed
  if Version >= 2.18 then begin
    // exported function count, for UOPilot
    InitStruct.FunctionCount := 1;
    setlength (InitStruct.FunctionNames, InitStruct.FunctionCount);
    // exported function names
    InitStruct.FunctionNames[0] := 'fexists'
  end else
    InitStruct.FunctionCount := 0;
  // if exported function count = 0, then plugin will be unloaded
  Result := @InitStruct;
end;

function fexists(patch:integer):integer; cdecl;
begin
fexists := patch;
end;

procedure DonePlugin; stdcall;
begin
  // free memory
  setlength (InitStruct.FunctionNames, 0);
end;

// exported function example
Exports
  InitPlugin,
  DonePlugin,
  fexists;
begin
end.




Со строками не работает. Что не так не догляжу
Пилот:

Код

--lua
log("clear")
local ffi = require("ffi")
local file = ffi.load("files.dll")
ffi.cdef[[
    __cdecl const char* fexists(const char* patch);
]]
local patch = "55"
local t = file.fexists(patch)
log(t)


длл:

Код

library files;

uses
  windows,
  Classes,
  SysUtils;

type
  tInitStruct = packed record
    FunctionCount : Cardinal;
    FunctionNames : Array of Pchar;
  end;

  tParamStruct = packed record
    WindowHandle : Cardinal; // Handle of workWindow
    WindowPID    : Cardinal; // pid of process of workWindow
    Reserved     : Cardinal;
    ParamString     : Pchar; // string of parameters with substituted variables
    ParamStringOrig : Pchar; // original string of parameters
    Result : array [0..32767] of char // array for returned values
  end;

var
  ParamStruct: ^tParamStruct;  // init by UOPilot
  InitStruct :  tInitStruct;   // init by plugin, free on unload

function InitPlugin(App, Scr: integer; Var Version: Real):Pointer; stdcall;
// App: Application.Handle of UOPilot
// Scr: reserved
begin
  // check UOPilot version, if it needed
  if Version >= 2.18 then begin
    // exported function count, for UOPilot
    InitStruct.FunctionCount := 1;
    setlength (InitStruct.FunctionNames, InitStruct.FunctionCount);
    // exported function names
    InitStruct.FunctionNames[0] := 'fexists'
  end else
    InitStruct.FunctionCount := 1;
  // if exported function count = 0, then plugin will be unloaded
  Result := @InitStruct;
end;

function fexists(patch:string):string; cdecl;
begin
fexists := patch;
end;

procedure DonePlugin; stdcall;
begin
  // free memory
  setlength (InitStruct.FunctionNames, 0);
end;

// exported function example
Exports
  InitPlugin,
  DonePlugin,
  fexists;
begin
end.



Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения



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

 

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