![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
dll
Vladimir1988 © (2009-12-01 20:22:00)Подскажите пожалуйста.
Создал DLL с функцией и процедурой.
Выходит сообщение: EXPORTS allowed only at global scope!
Если ставлю forward после function MySum (My:TMyClass): real; stdcall;
то надо как то определить Result. Подскажите пожалуйста как, но при этом он должен относиться к MySum.
library Project2;
uses
SysUtils,
Windows,
Classes;
{$R *.res}
type
TMyClass = class(TObject)
v1: real;
v2: real;
end;
procedure MyFirstFunc(My:TMyClass); stdcall ;
function MySum (My:TMyClass): real; stdcall;
begin
My := TMyClass.Create;
if (My.v1<2) or (My.v1>10) then
begin
MessageBox(0, 'Значения должны быть от 2 до 10. Повторите ввод', 'dll', MB_OK);
Exit;
end;
if (My.v2<2) or (My.v2>10) then
begin
MessageBox(0, 'Значения должны быть от 2 до 10. Повторите ввод', 'dll', MB_OK);
Exit;
end;
begin
Result:=My.v1+My.v2;
end;
My.Free;
end;
exports
MyFirstFunc,
MySum;
begin
end.
Игорь Шевченко (2009-12-01 23:23:00) [1]
> магистратура заставила изучать язык
не нас
Leonid Troyanovsky (2009-12-01 23:15:00) [2]
> Vladimir1988 © (01.12.09 23:01) [22]
> магистратура заставила изучать язык
Учение - мать мудрости.
--
Regards, LVT.
Vladimir1988 (2009-12-01 23:01:00) [3]магистратура заставила изучать язык
Демо (2009-12-01 23:00:00) [4]
> А ради чего оные мучения?Пардон.
Как я понимаю - эксперименты с передачей классовых объектов между DLL и приложением.
Leonid Troyanovsky (2009-12-01 22:59:00) [5]
> ladimir1988 © (01.12.09 20:22)
> Создал DLL с функцией и процедурой.
А ради чего оные мучения?
Пардон.
--
Regards, LVT.
Демо (2009-12-01 22:59:00) [6]
> Vladimir1988 ©
Ты учти, что у тебя только для этого простейшего случая "передача" экземпляра класса будет работать.
Vladimir1988 (2009-12-01 22:52:00) [7]Ладно Rouse спасибо просто огроменное что пронянчился со мной весь вечер, дальше доделаю
Vladimir1988 (2009-12-01 22:50:00) [8]а вот :
Form2.Edit3.Text := floattostr (MySum(My.v1,My.v2));
пишет [Error] Unit2.pas(43): Incompatible types: 'TMyClass' and 'Real'
Vladimir1988 (2009-12-01 22:49:00) [9]Да да только сам заметил
Rouse_ (2009-12-01 22:48:00) [10]Тэкс, смотри свой вызов:
Form2.Edit3.Text := floattostr (MySum(My.v1,My.v2));
и декларацию в библиотеке:
function MySum (My:TMyClass): real; stdcall;
и в приложении:
function MySum (v1,v2: real): real; stdcall; external 'Project2.dll';
Что-то тут у тебя не совсем сходится...
Vladimir1988 (2009-12-01 22:30:00) [11]и еще первый юнит1, но там только два Edit для ввода значений
Vladimir1988 (2009-12-01 22:29:00) [12]вот сама программа
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Edit3: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
type
TMyClass = class(TObject)
v1: real;
v2: real;
end;
var
Form2: TForm2;
My: TMyClass;
implementation
uses
Unit1;
procedure MyProc(); stdcall; external 'Project2.dll' name 'MyFirstFunc';
function MySum (v1,v2: real): real; stdcall; external 'Project2.dll';
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
My := TMyClass.Create;
begin
DecimalSeparator := ',';
My.v1:=strtofloat(StringReplace(Form1.edit1.text,'.',',',[]))
end;
begin
DecimalSeparator := ',';
My.v2:=strtofloat(StringReplace(Form1.edit2.text,'.',',',[]))
end;
MyProc();
Form2.Edit3.Text := floattostr (MySum(My.v1,My.v2));
My.Free;
end;
end.
Rouse_ (2009-12-01 21:46:00) [13]
> Если да, то теперь программа выдает распечатку какую то
> непонятную
А как именно ты вызываешь данную билиотеку? У меня все нормально выдает.
Vladimir1988 (2009-12-01 21:33:00) [14]Хорошо, если я правильно тебя понял то нужно так:
library Project2;
uses
SysUtils,
Windows,
Classes;
{$R *.res}
type
TMyClass = class(TObject)
v1: real;
v2: real;
end;
procedure MyFirstFunc(My:TMyClass); stdcall ;
begin
{My := TMyClass.Create; }
if (My.v1<2) or (My.v1>10) then
begin
MessageBox(0, 'Значения должны быть от 2 до 10. Повторите ввод', 'dll', MB_OK);
Exit;
end;
if (My.v2<2) or (My.v2>10) then
begin
MessageBox(0, 'Значения должны быть от 2 до 10. Повторите ввод', 'dll', MB_OK);
Exit;
end;
{My.Free; }
end;
exports
MyFirstFunc;
function MySum (My:TMyClass): real; stdcall;
begin
begin
Result:=My.v1+My.v2;
end;
end;
exports
MySum;
begin
end.
Если да, то теперь программа выдает распечатку какую то непонятную
Rouse_ (2009-12-01 21:24:00) [15]Это правильно, но дальнейшее использование не правильно.
Ты сознательно теряешь ссылку на переданный объект и пересоздаешь его.
(Правда по поводу передачи экземпляров класов нужно спросить у тех, кто такой "нехороший" подход использует, если память не изменяет мне то шаремем там тоже нужен)
Vladimir1988 (2009-12-01 21:20:00) [16]Я эту DLL использую в программе в которой ввожу данные переменные.
Для определения этих переменных в программе также использую
type
TMyClass = class(TObject)
v1: real;
v2: real;
end;
Правильно?
Игорь Шевченко (2009-12-01 21:16:00) [17]вложенные функции не экспортируются
Rouse_ (2009-12-01 21:15:00) [18]
> ну и в чем проблема?
> Что то я совсем не догоняю что ты имеешь ввиду
Ну хорошо, давай начнем с азов.
Ты создавши класс строкой:
My := TMyClass.Create;
сразу начинаешь проверять его параметры:
if (My.v1<2) or (My.v1>10) then
Это конечно очень хорошо, если бы не одно но: параметры его как-бы инициализированны по умолчанию, и откуда ты там ожидаешь значения мне немного не понятно.
Vladimir1988 (2009-12-01 21:13:00) [19]ну и в чем проблема?
Что то я совсем не догоняю что ты имеешь ввиду
Rouse_ (2009-12-01 21:09:00) [20]
> но тогда функция выполняется всегда, а должна если только
> значения подходят под условие
Ну тут проблема наверное вот тут:
My := TMyClass.Create;
if (My.v1<2) or (My.v1>10) then