Вниз
Скачать: CL | DM;

Простой вопрос по ДЛЛ   Найти похожие ветки 

← →
NightStranger ©   (2005-06-02 18:01) [0]

Hi, all! Пытаюсь постичь ДЛЛ... Скомпилировал ДЛЛку со следующим кодом

library MyLib;

uses
 SysUtils,
 Classes;

{$R *.RES}
function c(a,b:integer):integer;
begin
result:=a+b;
end;
exports
c;
begin
end.

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


← →
lookin ©   (2005-06-02 18:05) [1]

Как я понимаю, в interface

function с(a,b: integer): integer; stdcall;

А в implementation

function c(a,b: integer); external "MyLib.DLL";


← →
lookin ©   (2005-06-02 18:06) [2]

Либо же так, в interface:

function c(a,b: integer): integer; external "C:\MyLib.dll"; register;


← →
NightStranger ©   (2005-06-02 18:12) [3]

Сделал так:
...
interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
function c(a,b: integer): integer; stdcall;
var
 Form1: TForm1;

implementation

{$R *.DFM}
function c(a,b: integer):integer; external "MyLib.DLL";
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(c(10,5)));
end;

end.
Получил 6-8 значный ответ и окошко "CPU"  в придачу...


← →
lookin ©   (2005-06-02 18:14) [4]

>>Получил 6-8 значный ответ и окошко "CPU"  в придачу...

Это значит, что я ошибся в первом варианте. А что говорит второй?


← →
NightStranger ©   (2005-06-02 18:15) [5]

Не понял...


← →
lookin ©   (2005-06-02 18:16) [6]

Второй вариант тоже выдает "6-8 значный ответ и окошко "CPU"  в придачу..."?


← →
NightStranger ©   (2005-06-02 18:20) [7]

Если ты про "C:\MyLib.dll", то да. Пробовал с разными числами и разной локацией ДЛЛ - ни фига - все по старому


← →
MBo ©   (2005-06-02 18:23) [8]

stdcall убери - в библиотеке же нет этого модификатора


← →
lookin ©   (2005-06-02 18:24) [9]

А вот у меня все работает...

Код dll

library MyLib;

uses
 SysUtils,
 Classes;

{$R *.RES}

function c(a,b:integer):integer;
begin
 Result:=a+b;
end;

exports
c;
begin
end.

И код программы

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
 function c(a,b: integer): integer; external "C:\MyLib.dll"; register;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
 showmessage(inttostr(c(1,2)));
end;

end.


← →
NightStranger ©   (2005-06-02 18:24) [10]

Убрал. Работет. Спасибо. А что он обозначает (StdCall)


← →
begin...end ©   (2005-06-02 18:25) [11]

> NightStranger ©   (02.06.05 18:12) [3]

> Получил 6-8 значный ответ и окошко "CPU"  в придачу...

По умолчанию (если не указано иное) используется соглашение о передаче параметров register. В приведённом коде DLL явным образом соглашение не указано, значит, используется register. Поэтому и в хост-приложении функция должна быть описана с соглашением register.

Т.е. в приложении функцию нужно объявить так:

function c(a, b: integer): integer; external "MyLib.DLL";
или так:

function c(a, b: integer): integer; register; external "MyLib.DLL";



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.03 c
1-1118114964
ORMADA
2005-06-07 07:29
2005.06.29
DragDrop


4-1115173372
Алексей Петухов
2005-05-04 06:22
2005.06.29
Перехват конекстной F1


1-1118086794
Pasha L
2005-06-06 23:39
2005.06.29
openDialog


1-1118222933
Ярослав
2005-06-08 13:28
2005.06.29
Сохранить файл в Unicode


3-1116433051
RomanH
2005-05-18 20:17
2005.06.29
Сортировка в DBGrid по столбцам




   Наверх