Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизПростой вопрос по ДЛЛ Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c