Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2013, 19:43   #1
_DK
 
Регистрация: 12.04.2013
Сообщений: 3
По умолчанию [Delphi] Обмен данными между dll и главным приложением

Всем привет!
Дорогие пользователи ресурса, помогите разобраться в обмене данными между dll и приложением на простом примере.

Есть dll, содержащая форму. На форме, допустим, есть StringGrid1.
Также есть главное приложение, в котором подключается dll.
Как сделать следующее?

1) Передать параметры из приложения в dll-форму (чтобы, например, StringGrid1, постоянно обновляясь, принимал значения массива строк из главного приложения)

2) Передать параметры из dll-формы в приложение (чтобы при выделении ячейки StringGrid на форме - StringGrid1.OnSelectCell - главное приложение получало значение этой ячейки)

Как это лучше и проще сделать? Читал, что можно объявлять процедуры/функции в public и юзать из других модулей, передавая нужные параметры, либо использовать мессаги.

Пока dll-форма просто создается

dll-форма
Код:
library Project1;

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

procedure InitForm; stdcall; export;
begin
  Form1 := TForm1.Create(nil);
  Form1.Show;
end;

procedure FreeForm; stdcall; export;
begin
  FreeAndNil(Form1);
end;

exports InitForm;
exports FreeForm;

begin
end.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;

  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
главное приложение
Код:
unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

procedure InitForm; stdcall; external 'Project1.dll';
procedure FreeForm; stdcall; external 'Project1.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

begin

InitForm;

end.
_DK вне форума Ответить с цитированием
Старый 12.04.2013, 19:54   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

читайте про bpl
eval вне форума Ответить с цитированием
Старый 12.04.2013, 20:14   #3
_DK
 
Регистрация: 12.04.2013
Сообщений: 3
По умолчанию

не уверен что bpl подойдет, главное приложение делается не в delphi (хотя синтаксис delphi )...
_DK вне форума Ответить с цитированием
Старый 12.04.2013, 20:39   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Через сообщение можно передать 8 (максимум - 11) байт.
Правда, учитывая, что dll размещается в адресном пространстве процесса, это могут быть указатели, т.е. принципиально объем передаваемых данных не ограничен.
Но как-то принято обмениваться данными с dll через процедуры и функции.
И в чем прелесть dll - к ней можно обращаться из программы, написанной на любом языке.
Разумеется, сама dll не должна содержать специфичных для конкретного языка типов данных.
s-andriano вне форума Ответить с цитированием
Старый 13.04.2013, 17:24   #5
_DK
 
Регистрация: 12.04.2013
Сообщений: 3
По умолчанию

Пытаюсь осуществить обмен строками между DLL и приложением, строки из приложения в длл передаются нормально, а вот если наоборот - Access Violation. В чем может быть ошибка?

приложение:
Код:
{...}

type
  TExe_01_Form = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;

{...}

procedure ReadFromDllForm(S1,S2,S3: PChar); stdcall; external 'FormDLL.dll';

{...}

procedure TExe_01_Form.btnReadFromDllClick(Sender: TObject);
var msg1, msg2, msg3: PChar;
begin
  ReadFromDllForm(msg1, msg2, msg3);
  Edit1.Text:=StrPas(msg1);
  Edit2.Text:=StrPas(msg2);
  Edit3.Text:=StrPas(msg3);
end;


DLL:
Код:
{...}

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;

{...}

procedure ReadFromDllForm(S1, S2, S3: PChar); stdcall; export;
begin
  with Form1 do
  begin
    StrPCopy(S1, Edit1.Text);
    StrPCopy(S2, Edit2.Text);
    StrPCopy(S3, Edit3.Text);
  end;
end;

{...}

exports 
  ReadFromDllForm,

{...}
Вложения
Тип файла: zip _dll_01.zip (395.4 Кб, 9 просмотров)

Последний раз редактировалось _DK; 13.04.2013 в 17:27.
_DK вне форума Ответить с цитированием
Старый 13.04.2013, 17:36   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

В Delphi нестандартный и ни с чем не совместимый тип строки.
Поэтому использовать его в dll нельзя (точнее, крайне не рекомендуется).
Используйте для передачи C-строки, а в своей программе или dll преобразуйте к нужному виду.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обмен данными между программами nestor_petrovitch Общие вопросы Delphi 3 05.02.2012 20:56
Требуется написать программу на Delphi 7 - Обмен данными между MySQL и Excel yaskin Фриланс 9 08.11.2011 11:31
Обмен данными между DLL и программой Шульц Общие вопросы Delphi 8 16.03.2010 22:34
Обмен данными между двумя формами в Delphi NecroSlider Помощь студентам 2 30.07.2009 11:52
Обмен данными между С++ и С# Stellvertreter Общие вопросы C/C++ 0 14.11.2008 14:18