![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Простой вопрос по ДЛЛ [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';