Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.24;
Скачать: CL | DM;

Вниз

dll   Найти похожие ветки 

 
Vladimir1988 ©   (2009-12-01 20:22) [0]

Подскажите пожалуйста.
Создал 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.


 
Rouse_ ©   (2009-12-01 20:35) [1]


> EXPORTS allowed only at global scope

Перевести?


 
Vladimir1988 ©   (2009-12-01 20:58) [2]

нет подсказать как устранить...


 
Rouse_ ©   (2009-12-01 20:59) [3]

разнеси процедуру и функцию.


 
Vladimir1988 ©   (2009-12-01 21:05) [4]

пробовал, но тогда функция выполняется всегда, а должна если только значения подходят под условие


 
Rouse_ ©   (2009-12-01 21:09) [5]


> но тогда функция выполняется всегда, а должна если только
> значения подходят под условие

Ну тут проблема наверное вот тут:
My := TMyClass.Create;
if (My.v1<2) or (My.v1>10) then


 
Vladimir1988 ©   (2009-12-01 21:13) [6]

ну и в чем проблема?
Что то я совсем не догоняю что ты имеешь ввиду


 
Rouse_ ©   (2009-12-01 21:15) [7]


> ну и в чем проблема?
> Что то я совсем не догоняю что ты имеешь ввиду

Ну хорошо, давай начнем с азов.
Ты создавши класс строкой:
My := TMyClass.Create;
сразу начинаешь проверять его параметры:
if (My.v1<2) or (My.v1>10) then

Это конечно очень хорошо, если бы не одно но: параметры его как-бы инициализированны по умолчанию, и откуда ты там ожидаешь значения мне немного не понятно.


 
Игорь Шевченко ©   (2009-12-01 21:16) [8]

вложенные функции не экспортируются


 
Vladimir1988 ©   (2009-12-01 21:20) [9]

Я эту DLL использую в программе в которой ввожу данные переменные.
Для определения этих переменных в программе также использую
type
TMyClass = class(TObject)
v1: real;
v2: real;
end;
Правильно?


 
Rouse_ ©   (2009-12-01 21:24) [10]

Это правильно, но дальнейшее использование не правильно.
Ты сознательно теряешь ссылку на переданный объект и пересоздаешь его.
(Правда по поводу передачи экземпляров класов нужно спросить у тех, кто такой "нехороший" подход использует, если память не изменяет мне то шаремем там тоже нужен)


 
Vladimir1988 ©   (2009-12-01 21:33) [11]

Хорошо, если я правильно тебя понял то нужно так:

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:46) [12]


> Если да, то теперь программа выдает распечатку какую то
> непонятную

А как именно ты вызываешь данную билиотеку? У меня все нормально выдает.


 
Vladimir1988 ©   (2009-12-01 22:29) [13]

вот сама программа
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.


 
Vladimir1988 ©   (2009-12-01 22:30) [14]

и еще первый юнит1, но там только два Edit для ввода значений


 
Rouse_ ©   (2009-12-01 22:48) [15]

Тэкс, смотри свой вызов:
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:49) [16]

Да да только сам заметил


 
Vladimir1988 ©   (2009-12-01 22:50) [17]

а вот :
Form2.Edit3.Text := floattostr (MySum(My.v1,My.v2));

пишет [Error] Unit2.pas(43): Incompatible types: "TMyClass" and "Real"


 
Vladimir1988 ©   (2009-12-01 22:52) [18]

Ладно Rouse спасибо просто огроменное что пронянчился со мной весь вечер, дальше доделаю


 
Демо ©   (2009-12-01 22:59) [19]


> Vladimir1988 ©


Ты учти, что у тебя только для этого простейшего случая "передача" экземпляра класса будет работать.


 
Leonid Troyanovsky ©   (2009-12-01 22:59) [20]


> ladimir1988 ©   (01.12.09 20:22)  

> Создал DLL с функцией и процедурой.

А ради чего оные мучения?
Пардон.

--
Regards, LVT.


 
Демо ©   (2009-12-01 23:00) [21]


> А ради чего оные мучения?Пардон.


Как я понимаю - эксперименты с передачей классовых объектов между DLL и приложением.


 
Vladimir1988 ©   (2009-12-01 23:01) [22]

магистратура заставила изучать язык


 
Leonid Troyanovsky ©   (2009-12-01 23:15) [23]


> Vladimir1988 ©   (01.12.09 23:01) [22]

> магистратура заставила изучать язык

Учение - мать мудрости.

--
Regards, LVT.


 
Игорь Шевченко ©   (2009-12-01 23:23) [24]


> магистратура заставила изучать язык


не нас



Страницы: 1 вся ветка

Текущий архив: 2010.01.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.008 c
2-1259848543
kate158
2009-12-03 16:55
2010.01.24
добавление д-х из excel на пересечении строки и столбца


4-1217702866
kalexi
2008-08-02 22:47
2010.01.24
Как вызвать и обработать стандартный диалог открытия файлов?


15-1258207054
Спаситель человечества
2009-11-14 16:57
2010.01.24
Предлагаю средство для борьбы с вирусами (универсальное)


15-1258288584
GrayFace
2009-11-15 15:36
2010.01.24
К теме "Убойная статистика"


1-1233591166
Wadimka
2009-02-02 19:12
2010.01.24
Как защитить свою прогу? вернее, через сервер