Страница 1 из 1
Вопрос dll
Добавлено:
07.02.2011 22:42:12
AlexPavel
Возник такой вопрос:
Как из dll библиотеки возвратить в основную программу результаты выполнения процедуры?
При выполнении функций понятно как это делать, а вот как при выполнении процедур...
Re: Вопрос dll
Добавлено:
07.02.2011 23:03:48
Mr.Smart
Процедура от функции отличается одним, а именно функция возвращает результат своего выполнения.
Ваш вопрос не очень-то понятен. Приведите хотя-бы примерный код вашей процедуры, которая возвращает свой результат?
Re: Вопрос dll
Добавлено:
07.02.2011 23:22:07
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.
Re: Вопрос dll
Добавлено:
07.02.2011 23:27:49
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;
Re: Вопрос dll
Добавлено:
07.02.2011 23:28:04
alexs
А ты пробовал вместо DLL использовать для начала модули - для отладки.
Посмотри что получится в результате твоего кода. Подумай и почитай документацию.
Для затравки (глупый
) вопрос - а зачем у тебя переменная S два раза объявляется?
Re: Вопрос dll
Добавлено:
07.02.2011 23:29:46
Mr.Smart
Еще при компиляции dll выводит: Ошибка отладчика. Оп, отладчик находится в нерабочем состоянии. Сохраните работу!
Может не при компиляции, а при запуске (
F9)?
Re: Вопрос dll
Добавлено:
08.02.2011 00:04:24
AlexPavel
Пардон. Да, при запуске.
alexs, модули то понятно как использовать, просто я хотел немного разобраться с dll библиотеками, т.к. с ними не приходилось раньше сталкиваться.
Re: Вопрос dll
Добавлено:
08.02.2011 00:53:14
alexs
В первом приближении можно сказать что модули и dll при написании и использовании равнозначны. Различие лишь в виде связывания.
И в модуле и в DLL такоми кодом ты объявишь 2 СОВЕРШЕННО разные переменные, которые ни как не связаны между собой.
Re: Вопрос dll
Добавлено:
08.02.2011 01:32:43
AlexPavel
А не скажешь, как можно объявить переменную S один раз. А то если я ее объявляю один раз, например в dll, то сама программа ее не видит и наоборот.
Извиняюсь за идиотский вопрос.
Re: Вопрос dll
Добавлено:
08.02.2011 01:44:31
Padre_Mortius
AlexPavel
В вашем случае, лучше процедуру заменить на функцию и переменную S в библиотеке убрать совсем, т.к. она поменяется на Result
Re: Вопрос dll
Добавлено:
08.02.2011 11:27:26
zub
Если очень хочется, можно возвращать указатель на переменную из длл в программу и работать с ней через него. Такой подход требует объявления типа переменной и в длл и в программе, а экземпляра переменной только в длл и хорошо работает с простыми типами и record`ами, а с object`ами и class`ами - приводит к наличию в памяти 2х копий методов и прочей ООП требухи
Re: Вопрос dll
Добавлено:
08.02.2011 22:23:59
alexs
AlexPavel писал(а):А не скажешь, как можно объявить переменную S один раз
Padre_Mortius писал(а):В вашем случае, лучше процедуру заменить на функцию и переменную S в библиотеке убрать совсем, т.к. она поменяется на Result
Золотые слова!