Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

dll


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо