Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.24;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
15-1258876536
Гость
2009-11-22 10:55
2010.01.24
Проблема в C# (помогите найти ошибку)


15-1258639913
@!!ex
2009-11-19 17:11
2010.01.24
Подскажите головоломок не слишком сложных


15-1258916708
antonn
2009-11-22 22:05
2010.01.24
Аптайм сервера, долгий uptime


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


15-1258446035
_
2009-11-17 11:20
2010.01.24
Довлоадеры. Какой выбрать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский