Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: 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 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
14-1117743898
Олег-Николаев
2005-06-03 00:24
2005.06.29
Сайт


3-1115878600
leonidus
2005-05-12 10:16
2005.06.29
Глюк базы dBase если поле пустое


1-1118078113
Лунатик
2005-06-06 21:15
2005.06.29
блок-схема


1-1117703726
Phoenix9000
2005-06-02 13:15
2005.06.29
запуск процедуры в определенное время


14-1117529818
Jeer
2005-05-31 12:56
2005.06.29
Miss 2005