Форум: "Начинающим";
Текущий архив: 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