Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Вызов функций внутри DLL на Delphi из самой DLL

Delphi , Файловая система , DLL и PlugIns

Вопрос, поднятый в данной теме, касается возможности вызова функций, которые были вызваны самой DLL изнутри, причем исходным языком написания DLL является Delphi. Пользователь столкнулся с проблемой, когда функция, написанная на языке EasyLanguage, вызывала функцию в DLL, и возникал вопрос о возможности использования адреса возврата из функции EasyLanguage во время выполнения кода внутри DLL для вызова функции на языке EasyLanguage после возврата адреса. Поскольку язык EasyLanguage не имеет команды для экспорта функций и не может передавать указатели, было необходимо найти альтернативное решение.

Решение проблемы

Для решения задачи можно использовать следующий подход:

  1. Передача информации о вызове функции через параметры: Вместо того чтобы передавать указатели на функции, можно передавать информацию о вызове функции через строковые параметры. В DLL функция может анализировать полученную строку и определять, какую функцию необходимо вызвать, а также какие параметры для неё требуются.

  2. Использование циклов для обмена данными: В коде DLL и исполняемого приложения необходимо использовать циклы для обмена данными. Пример: DLL получает вызов функции с начальными параметрами, обрабатывает их, возвращает результат выполнения в виде строки, содержащей информацию о состоянии и результатах вычислений, после чего исполняемое приложение анализирует строку, вызывает необходимую функцию и цикл повторяется.

  3. Парсинг параметров: Для обработки строковых параметров, содержащих информацию о вызове функций, можно использовать специальные функции парсинга.

  4. Тестирование: Важно тщательно протестировать реализацию, чтобы избежать непредвиденного поведения в реальных условиях работы программы.

Пример кода

Ниже приведен упрощенный пример кода для демонстрации описанного подхода.

Код для исполняемого приложения:

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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:40:58/0.003593921661377/0