Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Простой вопрос по ДЛЛ [D5, WinXP]


NightStranger ©   (2005-06-02 18:01:00) 

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

library MyLib;

uses
 SysUtils,
 Classes;

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

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


begin...end   (2005-06-02 18:25:00) [1]

> 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';


lookin   (2005-06-02 18:24:00) [2]

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

Код 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:00) [3]

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


MBo   (2005-06-02 18:23:00) [4]

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


NightStranger   (2005-06-02 18:20:00) [5]

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


lookin   (2005-06-02 18:16:00) [6]

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


NightStranger   (2005-06-02 18:15:00) [7]

Не понял...


lookin   (2005-06-02 18:14:00) [8]

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

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


NightStranger   (2005-06-02 18:12:00) [9]

Сделал так:
...
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:06:00) [10]

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

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


lookin   (2005-06-02 18:05:00) [11]

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

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

А в implementation

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо