Вопрос dll

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
AlexPavel
новенький
Сообщения: 12
Зарегистрирован: 28.12.2009 19:31:43

Вопрос dll

Сообщение AlexPavel »

Возник такой вопрос:
Как из dll библиотеки возвратить в основную программу результаты выполнения процедуры?
При выполнении функций понятно как это делать, а вот как при выполнении процедур...
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Процедура от функции отличается одним, а именно функция возвращает результат своего выполнения.
Ваш вопрос не очень-то понятен. Приведите хотя-бы примерный код вашей процедуры, которая возвращает свой результат?
AlexPavel
новенький
Сообщения: 12
Зарегистрирован: 28.12.2009 19:31:43

Сообщение AlexPavel »

Мне необходимо полученные результаты в dll использовать в основной программе.
Вот простой пример. Как вывести результат в основной программе?
Пример программы:

Код: Выделить всё

program project2;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

{$IFDEF WINDOWS}{$R project2.rc}{$ENDIF}
  var
  a, S: real;
  Procedure Summa(a: real);external 'project1.dll' ;
begin
 a:=7;
 Summa(a);
 Writeln('S=',S);
 readln;
end.
         


Пример библиотеки:

Код: Выделить всё

library project1;

{$mode objfpc}{$H+}

uses
  Classes
  { you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
 Procedure Summa(a: real);stdcall;
 var S: real;
 begin
 S:=a+1;
 end;
exports
Summa;
begin
end.   


Еще при компиляции dll выводит: Ошибка отладчика. Оп, отладчик находится в нерабочем состоянии. Сохраните работу!
А в окне сообщений: Local variable "S" is assigned but never used.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Экспортировать переменные из библиотеки не получится! Да это ещё и дурной тон.
Как вариант создать дополнительную функцию, которая возвращает значение переменной S.

Код: Выделить всё

function GetS: Real; stdcal;
begin
  Result:=S;
end;

или добавить в функцию Summ дополнительный параметр который возвращает или меняет значение.

Код: Выделить всё

Procedure Summa(a: real; var S: real);stdcall;
begin
S:=a+1;
end;
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А ты пробовал вместо DLL использовать для начала модули - для отладки.
Посмотри что получится в результате твоего кода. Подумай и почитай документацию.

Для затравки (глупый :D ) вопрос - а зачем у тебя переменная S два раза объявляется?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Еще при компиляции dll выводит: Ошибка отладчика. Оп, отладчик находится в нерабочем состоянии. Сохраните работу!

Может не при компиляции, а при запуске (F9)?
AlexPavel
новенький
Сообщения: 12
Зарегистрирован: 28.12.2009 19:31:43

Сообщение AlexPavel »

Пардон. Да, при запуске.
alexs, модули то понятно как использовать, просто я хотел немного разобраться с dll библиотеками, т.к. с ними не приходилось раньше сталкиваться.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

В первом приближении можно сказать что модули и dll при написании и использовании равнозначны. Различие лишь в виде связывания.
И в модуле и в DLL такоми кодом ты объявишь 2 СОВЕРШЕННО разные переменные, которые ни как не связаны между собой.
AlexPavel
новенький
Сообщения: 12
Зарегистрирован: 28.12.2009 19:31:43

Сообщение AlexPavel »

А не скажешь, как можно объявить переменную S один раз. А то если я ее объявляю один раз, например в dll, то сама программа ее не видит и наоборот.
Извиняюсь за идиотский вопрос. :wink:
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

AlexPavel
В вашем случае, лучше процедуру заменить на функцию и переменную S в библиотеке убрать совсем, т.к. она поменяется на Result
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Если очень хочется, можно возвращать указатель на переменную из длл в программу и работать с ней через него. Такой подход требует объявления типа переменной и в длл и в программе, а экземпляра переменной только в длл и хорошо работает с простыми типами и record`ами, а с object`ами и class`ами - приводит к наличию в памяти 2х копий методов и прочей ООП требухи
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

AlexPavel писал(а):А не скажешь, как можно объявить переменную S один раз

Padre_Mortius писал(а):В вашем случае, лучше процедуру заменить на функцию и переменную S в библиотеке убрать совсем, т.к. она поменяется на Result

Золотые слова!
Ответить