Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
1-1118228609
lehich
2005-06-08 15:03
2005.06.29
использование ARJ из файла res


1-1117875729
Masta Hookah
2005-06-04 13:02
2005.06.29
COPY FILE


14-1117003396
Анонимщик1
2005-05-25 10:43
2005.06.29
Шахматная дуэль


14-1117482353
Juice
2005-05-30 23:45
2005.06.29
Ошибка - сеть не доступна


4-1114862396
Новичек
2005-04-30 15:59
2005.06.29
Рисование с помощью API.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский