0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 14
1

Динамический вызов процедур из библиотеки DLL

17.06.2013, 23:51. Показов 3473. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите пожалуйста. как сделать динамический вызов процедур из библиотеки длл . в окно edit1 вводится ряд чисел через пробел , потом идёт вызов процедуры из длл ,которая сортирует этот ряд чисел методом прямого обмена и выводит результат в окно Edit2 . кампилятор выдаёт ошибку в коде. код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Unitdef;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Label4: TLabel;
    Label5: TLabel;
 
 
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
Tobmena=procedure(var a:tdar);
var
  Form1: TForm1;
  a:tdar;
 
implementation
 
{$R *.dfm}
procedure p(var x:integer);external'dll';
procedure obmena(var a:tdar);external'dll';
procedure sheyker(var a:tdar);external'dll';
procedure vstavka(var a:tdar);external'dll';
procedure sort_shell(var a:tdar);external'dll';
procedure vibora(var a:tdar);external'dll';
 
 procedure TForm1.Button8Click(Sender: TObject);
 var
  dll_instance: Thandle;
  obmena: Tobmena;
  s:string;
i:integer;
 
 begin
 dll_instance:= LoadLibrary('dll');
  @obmena:= GetProcAddress(dll_instance, 'obmena');
 for i:=0 to high(a) do
Edit1.Text:=StrToInt(obmena(a[i]));
 
   s:=s+inttostr(a[i])+' ';
  edit2.Text:=s;
 
 
  FreeLibrary(dll_instance);
 
 
end;
end.
Добавлено через 16 минут
Edit1.Text:=StrToInt(obmena(a[i]));

ошибку пишет вот тут, подправьте пожалуйста . заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2013, 23:51
Ответы с готовыми решениями:

Как реализовать вызов процедур
Необходимо из 5 кнопок сделать 1 :) Есть 5 точек каждая имеет по 4 параметра сначало выбирается...

Вызов событий компонента из его процедур
Привет. Продолжаю реализовывать свой компонент и дошло дело до его событий. Прочитав специальную...

Вызов процедур класса из другого Unit
День добрый... Вот какая ситуация: У меня есть 2 юнита. 1 стандартный, с формой и всем остальным. А...

Создание dll библиотеки в C#. Вызов классов этой библиотеки
мне нужно как то создать динамическую библиотеку класов в си шарп, основой этой библиотеки должен...

9
1173 / 479 / 83
Регистрация: 04.03.2010
Сообщений: 1,019
18.06.2013, 08:58 2
Дорогой автор, ну вы же посмотрите что написали. поле.текст = СтрокуВчисло. зачем конвертируете строку в число и присваиваете строке?
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
18.06.2013, 09:10 3
Процедура - не функция, чтобы ее в качестве параметра передавать.
0
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 14
18.06.2013, 18:38  [ТС] 4
покажите пожалуйста как там должно быть.:
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
18.06.2013, 18:49 5
Там намешано непонятно чего.
Что такое tdar?
Где инициализируется переменная а?
0
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 14
18.06.2013, 19:31  [ТС] 6
tdar-это массив.
Delphi
1
2
3
4
5
6
7
unit Unitdef;
 
interface
 
 type
tdar=array of integer;
implementation
Добавлено через 1 минуту
вот статический вызов , он работает
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Unitdef;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Label4: TLabel;
    Label5: TLabel;
 
 
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
Tobmena=procedure(var a:tdar);
var
  Form1: TForm1;
  a:tdar;
 
implementation
 
{$R *.dfm}
procedure p(var x:integer);external'dll';
procedure obmena(var a:tdar);external'dll';
procedure sheyker(var a:tdar);external'dll';
procedure vstavka(var a:tdar);external'dll';
procedure sort_shell(var a:tdar);external'dll';
procedure vibora(var a:tdar);external'dll';
 
 
 
 
 
procedure TForm1.Button3Click(Sender: TObject);
 
var
s,s1:string;
i,k:integer;
begin
 s:=edit1.Text+' ';
 i:=0;
 repeat
   k:=pos(' ',s);
   setlength(a,i+1);
    s1:=copy(s,1,k-1);
  a[i]:=strtoint(s1);inc(i);
  delete(s,1,k);
 until length(s)=0;
 showmessage (inttostr(i)) ;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var s:string;
i:integer;
begin
 
  obmena(a);
  for i:=0 to high(a) do
   s:=s+inttostr(a[i])+' ';
  edit2.Text:=s;
 
end;
Добавлено через 22 секунды
теперь мне тоже самое надо только в динамическом

Добавлено через 1 минуту
и я запутался с ним и не пойму что исправить вот тут надо
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button8Click(Sender: TObject);
 var
  dll_instance: Thandle;
  obmena: Tobmena;
  s:string;
i:integer;
 
 begin
 dll_instance:= LoadLibrary('dll');
  @obmena:= GetProcAddress(dll_instance, 'obmena');
 for i:=0 to high(a) do
Edit1.Text:=StrToInt(obmena(a[i]));{(StrToInt(edit1.Text),StrToInt(edit2.Text)));   }
 
   s:=s+inttostr(a[i])+' ';
  edit2.Text:=s;
 
 
  FreeLibrary(dll_instance);
0
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,162
18.06.2013, 19:38 7
как то так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  Tp = procedure(var x:integer); StdCall;
...
var
  Handle: THandle;
  p: Tp;
begin
  try
    Handle := LoadLibrary('Dll.dll');
      if Handle <> 0 then @p := GetProcAddress(Handle, 'p');
        if @p <> nil then p(10);
  finally
    FreeLibrary(Handle);
  end;
end;
0
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 14
18.06.2013, 19:50  [ТС] 8
пишет ошибку в это строке
Delphi
1
if @p <> nil then p(10);
0
474 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,162
18.06.2013, 20:00 9
в длл должно быть что то типо:
Delphi
1
2
3
4
5
6
procedure p(var x:integer); StdCall;
begin
...
end;
exports
  p;
вообще я те написал образный пример, я не экстрасенс
0
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 14
18.06.2013, 20:16  [ТС] 10
вот что у меня написано в основной программе
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
 
 Tobmena = procedure(var a:tdar); StdCall;
implementation
 
{$R *.dfm}
 
procedure obmena(var a:tdar);external'dll';
......
procedure TForm1.Button8Click(Sender: TObject);
var
  Handle: THandle;
  obmena: Tobmena;
begin
  try
    Handle := LoadLibrary('Dll.dll');
      if Handle <> 0 then @obmena := GetProcAddress(Handle, 'p');
        if @obmena <> nil then obmena(10);
  finally
    FreeLibrary(Handle);
  end;
end;
Добавлено через 2 минуты
вот что в dll
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure obmena(var a:tdar);
var i,j,r,x:integer;
 
begin
 
 
     for i:=low(a) to high(a) do
     begin
          r:=i;
          x:=a[i];
          for j:=i+1 to high(a) do
              if a[j]<x then//íàõîäèì ìèíèìàëüíîå èç îñòàâøèõñÿ è çàïîìèíàåì åãî èíäåêñ.
              begin
                   r:=j;//èíäåêñ
                   x:=a[r];//ìèíèìóì èç îñòàòêà ìàññèâà
              end;
          a[r]:=a[i];//ìåíÿåì, åñëè íàäî
          a[i]:=x;//òóò íà ñàìîì äåëå ëåæèò a[r]. òî åñòü îáìåíÿëèñü ýëåìåíòàìè â ìàññèâå
     end;
exports obmena;
 
begin
end.
 
     end;
Добавлено через 1 минуту
obmena -это сортировка массива tdar методом прямого обмена.
0
18.06.2013, 20:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2013, 20:16
Помогаю со студенческими работами здесь

Вызов процедур из DLL, расположенных на удаленном компьютере
Добрый день! Столкнулся с необходимостью вынести часть функционала своей C# программы в DLL,...

Вызов native из dll библиотеки
файл Mydll.java public class Mydll { native public static void testfunc(); static {...

Вызов из библиотеки (dll) формы (form)
Здравствуйте. Суть такая: пишу библиотеку для подключения к vba. На шарпе присоединить не вышло, на...

Как использовать методы библиотеки DLL, и игнорировать их, когда DLL нету?
Как использовать методы библиотеки DLL , и игнорировать их когда DLL нету Что нужно , мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru