Вниз
Скачать: 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.052 c
3-1116476386
dreamse
2005-05-19 08:19
2005.06.29
Какой коммандой удалить базу из SQL сервера ?


4-1115666441
n0wheremany
2005-05-09 23:20
2005.06.29
Информация о процессе


14-1117462017
Fessio
2005-05-30 18:06
2005.06.29
хелп плизз с методом резолюций


1-1118249091
terra0
2005-06-08 20:44
2005.06.29
Динамические массивы


14-1117819487
VEG
2005-06-03 21:24
2005.06.29
Кто заметил, когда пропал the5k.org ?




   Наверх