Вопрос, поднятый в данной теме, касается возможности вызова функций, которые были вызваны самой DLL изнутри, причем исходным языком написания DLL является Delphi. Пользователь столкнулся с проблемой, когда функция, написанная на языке EasyLanguage, вызывала функцию в DLL, и возникал вопрос о возможности использования адреса возврата из функции EasyLanguage во время выполнения кода внутри DLL для вызова функции на языке EasyLanguage после возврата адреса. Поскольку язык EasyLanguage не имеет команды для экспорта функций и не может передавать указатели, было необходимо найти альтернативное решение.
Решение проблемы
Для решения задачи можно использовать следующий подход:
Передача информации о вызове функции через параметры:
Вместо того чтобы передавать указатели на функции, можно передавать информацию о вызове функции через строковые параметры. В DLL функция может анализировать полученную строку и определять, какую функцию необходимо вызвать, а также какие параметры для неё требуются.
Использование циклов для обмена данными:
В коде DLL и исполняемого приложения необходимо использовать циклы для обмена данными. Пример: DLL получает вызов функции с начальными параметрами, обрабатывает их, возвращает результат выполнения в виде строки, содержащей информацию о состоянии и результатах вычислений, после чего исполняемое приложение анализирует строку, вызывает необходимую функцию и цикл повторяется.
Парсинг параметров:
Для обработки строковых параметров, содержащих информацию о вызове функций, можно использовать специальные функции парсинга.
Тестирование:
Важно тщательно протестировать реализацию, чтобы избежать непредвиденного поведения в реальных условиях работы программы.
Пример кода
Ниже приведен упрощенный пример кода для демонстрации описанного подхода.
Код для исполняемого приложения:
unit CallingCallerDemoMain;
interface
uses
Winapi.Windows, Winapi.Messages,
System.SysUtils, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
ParamParsing;
type
TCallingCallerForm = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
function CallDll(Value: Integer): String;
function DemoSquare(Arg1: Integer): Integer;
function DemoSum(Arg1: Integer): Integer;
end;
function DllFunc(
StrIn : PAnsiChar
) : PAnsiChar; stdcall; external 'CallingCallerDemoDll.dll';
implementation
{$R *.dfm}
function TCallingCallerForm.DemoSquare(Arg1 : Integer) : Integer;
begin
Result := Arg1 * Arg1;
Memo1.Lines.Add('DemoSquare called');
end;
function TCallingCallerForm.DemoSum(Arg1 : Integer) : Integer;
begin
Result := Arg1 + Arg1;
Memo1.Lines.Add('DemoSum called');
end;
function TCallingCallerForm.CallDll(Value : Integer) : String;
begin
// Код для вызова функции DLL и обработки результатов
end;
procedure TCallingCallerForm.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add('Result: ' + CallDll(4));
end;
end.
Код для DLL:
library CallingCallerDemoDll;
uses
System.SysUtils,
System.Classes,
ParamParsing in '..\DirectCompute\Mandel\Delphi\ParamParsing.pas';
{$R *.res}
function DllFunc(StrIn : PAnsiChar) : PAnsiChar; stdcall;
begin
// Код для обработки строки и вызова функций исполняемого приложения
end;
exports
DllFunc;
begin
end.
И дополнительный модуль для парсинга параметров:
unit ParamParsing;
interface
uses
SysUtils;
function ParamByNameAsString(
const Params : String;
const ParamName : String;
var Status : Boolean;
const DefValue : String) : String;
function ParamByNameAsInteger(
const Params : String;
const ParamName : String;
var Status : Boolean;
const DefValue : Integer) : Integer;
implementation
// Код для парсинга параметров
end.
Заключение
Данный подход позволяет реализовать обмен данными между DLL и исполняемым приложением, не используя экспорт функций и указатели. Это решение может быть не самое эффективное с точки зрения производительности, но оно позволяет достичь желаемого результата в рамках заданных ограничений.
Вопрос касается механизма вызова функций внутри DLL на Delphi из самой DLL, с использованием строк для определения функций и параметров.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.