callback function от C++ dll
3 отговора
0 прегледа
callback function от C++ dll
здр.
някой можели да помогне как се използва callback function от C++ dll в делфи.
някой можели да помогне как се използва callback function от C++ dll в делфи.
Процедурни типове
В Delphi трябва да си декларираш тип, който да съответства на твоята функция - например нещо такова:
Обърни внимание на типовете на параметрите, резервирането и освобождаването на памет (буфери, стрингове и т.н.) и конвенцията на извикването. Delphi използва по-ефективната register, но функцията от твоя DLL вероятно ще е stdcall.
След това си декларираш променлива от този тип и си взимаш адреса на функцията с GetProcAddress:
Linux isn't free, it's worthless.
type TDLLCallback = procedure (Param1: Int; Param2: PChar); stdcall;
Обърни внимание на типовете на параметрите, резервирането и освобождаването на памет (буфери, стрингове и т.н.) и конвенцията на извикването. Delphi използва по-ефективната register, но функцията от твоя DLL вероятно ще е stdcall.
След това си декларираш променлива от този тип и си взимаш адреса на функцията с GetProcAddress:
var DLLCallback: TDLLCallback;
begin
@DLLCallback := GetProcAddress(DLLHandle, 'MyCallbackFunction');
if Assigned(DLLCallback) then
DLLCallback(Param1, Param2)
else
raise Exception.Create('....');
end;
Linux isn't free, it's worthless.
Re: Процедурни типове
Нещо аз немота да се оправя.
Това, което трябва да направя е да извикам функция от dll, в която да дам поинтърите на 2 мои функции, които ще се викат с callback от dll.
Инициализиращата функцията е : Init(t_API)
struct {E_STATUS STATUS; E_DOST DOST;} t_API;
след това стартирам например функция от dll например run(par1 : int ,par2 : int) : int
и dll връща резултати като извиква функциите E_STATUS и E_DOST.
Това, което аз направих, но не съм сигурен дали е ОК:
Направих си тип:
type
t_API = record
E_STATUS : Pointer;
E_DOST : Pointer;
end;
var
my_ APi : t_API
имам 2 дефинирани фунции
function F_STATUS (parm1 : Integer) : Integer;
function F_ DOST (parm1 : Integer) : Integer;
и преди да извикам Init попъпвам my_ APi.
my_APi.E_STATUS := MethodAddress(‘F_STATUS’);
my_APi.E_DOST := MethodAddress(‘F_ DOST’);
и след това викам : Init(my_ APi);
но нещо не се получава и не знам дали проблема е при мен или в dll?
Dll работи с друго приложение, писано на C#.
дали това е правилно или има ли друг начин на постигна целта си.
Това, което трябва да направя е да извикам функция от dll, в която да дам поинтърите на 2 мои функции, които ще се викат с callback от dll.
Инициализиращата функцията е : Init(t_API)
struct {E_STATUS STATUS; E_DOST DOST;} t_API;
след това стартирам например функция от dll например run(par1 : int ,par2 : int) : int
и dll връща резултати като извиква функциите E_STATUS и E_DOST.
Това, което аз направих, но не съм сигурен дали е ОК:
Направих си тип:
type
t_API = record
E_STATUS : Pointer;
E_DOST : Pointer;
end;
var
my_ APi : t_API
имам 2 дефинирани фунции
function F_STATUS (parm1 : Integer) : Integer;
function F_ DOST (parm1 : Integer) : Integer;
и преди да извикам Init попъпвам my_ APi.
my_APi.E_STATUS := MethodAddress(‘F_STATUS’);
my_APi.E_DOST := MethodAddress(‘F_ DOST’);
и след това викам : Init(my_ APi);
но нещо не се получава и не знам дали проблема е при мен или в dll?
Dll работи с друго приложение, писано на C#.
дали това е правилно или има ли друг начин на постигна целта си.
Re: Процедурни типове
Какво означава "нещо не се получава"? Предполагам получаваш access violation. С каква конвенция на извикване се очаква да са твоите функции? stdcall? Защото не виждам да си ги декларирал така, а едва ли трябва да са register. Предполагам, че тия две функции си ги декларирал като методи на някой клас. Направи ги да са обикновени функции (да не са методи на клас), укажи правилната конвенция на извикване (например function F_STATUS (parm1 : Integer) : Integer; stdcall;) и си инициализирай указателите така: E_STATUS := @F_STATUS;
Linux isn't free, it's worthless.
Linux isn't free, it's worthless.