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

Решение проблемы передачи строковых данных через интерфейс `PCHAR` между DLL и исполняемой программой на Delphi

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

Решение проблемы передачи строковых данных через интерфейс PCHAR между DLL и исполняемой программой на Delphi

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

Подробности проблемы:

  • В Delphi 2007 и более ранних версиях тип String является псевдонимом для AnsiString, а PChar — псевдонимом для PAnsiChar.
  • В Delphi 2009 и последующих версиях String является псевдонимом для UnicodeString, а PChar — псевдонимом для PWideChar.

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

  1. Исправление интерфейса SetOnCommandProc: В DLL должен быть один параметр, а не два, как было в исходном коде.

  2. Исправление вызова соглашения вызова: В DLL функция TryTheEvent должна быть объявлена с stdcall.

  3. Упрощение функции OnEventMessage: Необходимо избавиться от лишней сложности и утечки памяти.

  4. Исправление некорректного приведения типов: В исполняемой программе некорректно используется приведение типа TForm1 к sMessage, что недопустимо, так как PAnsiChar не является ссылкой на объект.

  5. Исправление использования оператора @: При получении указателя на функцию необходимо убедиться, что тип проверяется корректно.

Предложенный код:

library mydll;
uses
  SysUtils;
type
  TOnCommandProc = procedure(sMessage: PAnsiChar); stdcall;
var
  FOnCommandProc: TOnCommandProc = nil;
procedure SetOnCommandProc(CallbackProc: TOnCommandProc); stdcall;
begin
  FOnCommandProc := CallbackProc;
end;
procedure OnEventMessage(Data: AnsiString);
begin
  if Assigned(FOnCommandProc) then
    FOnCommandProc(PAnsiChar(Data));
end;
procedure TryTheEvent; stdcall;
begin
  OnEventMessage('Hello');
end;
exports
  SetOnCommandProc, TryTheEvent;
end.

И исполняемая программа:

unit Unit1;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    class procedure MyOnCommandProc(sMessage: PAnsiChar); stdcall; static;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
type
  TOnCommandProc = procedure(sMessage: PAnsiChar); stdcall;
procedure SetOnCommandProc(CallbackProc: TOnCommandProc); stdcall; external 'mydll.dll';
procedure TryTheEvent; stdcall; external 'mydll.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
  TryTheEvent;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetOnCommandProc(MyOnCommandProc);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetOnCommandProc(nil);
end;
class procedure TForm1.MyOnCommandProc(sMessage: PAnsiChar);
begin
  ShowMessage(sMessage);
end;
end.

Важные замечания:

  • В коде DLL тип Data изменён на AnsiString, что соответствует типу PAnsiChar, используемому в функции FOnCommandProc.
  • В исполняемой программе функция MyOnCommandProc вызывается без дополнительных параметров, что соответствует изменённому интерфейсу SetOnCommandProc в DLL.

Заключение:

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

Создано по материалам из источника по ссылке.

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


Комментарии и вопросы

Получайте свежие новости и обновления по 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:44:28/0.0035049915313721/0