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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2019, 01:02   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Подключение библиотек

Привет, есть главная форма и набор модулей (dll) на главной форме список доступных модулей и 1 кнопка для открытия нужного модуля.
вот код этой кнопки:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  showF: procedure(f: TApplication); stdcall;
  setModul: procedure(s: string); stdcall;
begin
  @setModul := nil;
  dll := LoadLibrary(PWideChar(Label43.Caption));
  @showF := nil;
  if dll <> 0 then
  begin
    @showF := GetProcAddress(dll, 'showModul');
    @setModul := GetProcAddress(dll, 'SetModul');
  end
  else
    exit;
  if @setModul <> nil then
    setModul(selectednode);
  if @showF <> nil then
    showF(Application);
end;
в библиотеках всегда есть метод showModul, он везде одинаковый создает и показывает форму модуля, но есть модуль в который нужно передать параметр...
на это создан метод SetModul в который собственно и нужно передать параметр.
код библиотеки:
Код:
library OWN;

uses
  Vcl.Forms,
  System.SysUtils,
  System.Classes,
  uOWN in 'uOWN.pas' {fOWN},
  uOWNT in 'uOWNT.pas' {fOWNT};

{$R *.res}
const
  ver = '4';
  dateBuild = '29.03.2019';

function GetVersion(): String;
begin
  Result := ver;
end;

function GetDate(): String;
begin
  Result := dateBuild;
end;

procedure showModul(f: TApplication);
begin
  f.CreateForm(TfOWN, fOWN);
  f.CreateForm(TfOWNT, fOWNT);
  fOWN.Show;
end;

procedure SetModul(s:string);
begin
   ModulObject:= s; //ModulObject - переменная типа string на fOWN
  fown.Caption:=ModulObject;
end;

exports showModul, GetDate, GetVersion, SetModul;

begin
end.
работать то оно работает, но после закрытия основного окна появляется сообщение "Runtime Error 216 at addres"
я через дебаг режим посмотрел что хранит в себе переменная @setModul если вызвать модуль без этого метода и она оказалась не nil, в ней что то было, думаю именно по этому и вылетает ошибка после закрытия, но я не знаю как ее устранить, подскажите пожалуйста

P.S.
Кажется я пытаюсь присвоить значение переменной которая еще не создана...... но как тогда оно работает!?

P.S.
Пробую вот так:
Код:
procedure showModul(f: TApplication; s:string);
var s1,s2:string;
begin
  f.CreateForm(TfOWN, fOWN);
  f.CreateForm(TfOWNT, fOWNT);
  ModulObject:= s;
  fown.Caption:=s;
  fOWN.Show;
end;
ну и кнопка в главной форме:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  showF: procedure(f: TApplication; s:string); stdcall;
begin
  dll := LoadLibrary(PWideChar(Label43.Caption));
  @showF := nil;
  if dll <> 0 then
    @showF := GetProcAddress(dll, 'showModul')
  else
    exit;
  if @showF <> nil then
    showF(Application,selectednode);
end;
при этом в библиотеку (в параметр s:string) ничего не приходит, я проверил, переменная selectednode не пуста

P.S.
Получилось, создавая отдельный метод и через него сохранять значение в переменную, а при создании формы брать это значение.

Последний раз редактировалось PTyTb32; 30.03.2019 в 14:07.
PTyTb32 вне форума Ответить с цитированием
Старый 30.03.2019, 16:07   #2
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

А на сколько правильно закрывать целое приложение в DLL? программа со своими формами, методами хранится в одном DLL и может быть реализована лишь с помощью делфи той же версии.. я писал на 10.1 и при попытке использовать ее методы из под делфи 7 ничего не работало, в плоть до кодировки.. это "говнокод"?
PTyTb32 вне форума Ответить с цитированием
Старый 31.03.2019, 12:57   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
это "говнокод"?
похоже на то..
Код "правильной" длл'ки не должен зависеть от версии компилятора 7 или 10. Более того, нет разницы на каком языке программирования написана длл. Например, большинство системных либ Win написаны на сях, но их функции спокойно импортируются в программы на других языках.

Для проверки, могу написать DLL на ассемблере с одной функцией "HelloWorld!", а ты подключи её к своему проекту в Дельфи, и вызови экспортируемую из этой DLL функцию - должно работать как часы.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 31.03.2019, 21:37   #4
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Код "правильной" длл'ки не должен зависеть от версии компилятора 7 или 10.
в этом то и прелесть dll однако из под 7 ки при вызове функций из библиотеки страдает кодировка и это вызывает ошибки, в прочем это не важно, конкретно в моем случае библиотеки служат как модули расширяющие функционал основной системы, они не предназначены для других приложений
PTyTb32 вне форума Ответить с цитированием
Старый 03.04.2019, 11:18   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Хоть IDE и последняя, разве допустимо передавать во внешние методы библиотеки тип string? только PChar.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 03.04.2019, 16:40   #6
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Хоть IDE и последняя, разве допустимо передавать во внешние методы библиотеки тип string? только PChar.
Спасибо, я учту это
PTyTb32 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение библиотек Drago56 C++ Builder 3 30.05.2016 06:33
Fortran - подключение библиотек simplermethod Помощь студентам 0 16.05.2014 17:10
Подключение библиотек mishalive Общие вопросы Delphi 5 23.08.2011 09:50
Подключение библиотек Sparky Qt и кроссплатформенное программирование С/С++ 17 18.08.2011 22:23
Подключение библиотек MovsesIV Общие вопросы C/C++ 1 27.12.2010 21:25