Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.30;
Скачать: CL | DM;

Вниз

Delphi + dll на C++   Найти похожие ветки 

 
LightKnight ©   (2003-12-17 11:37) [0]

Здравствуйте!

У меня есть такая проблема.
Никак не получается обратиться в Delphi к функции из dll-ки, написанной на C++.
Dll-ка подключается без проблем, и основная часть функций работает, кроме функций типа:

int CALLBACK dllFunction(HWND hwnd, void (CALLBACK *Fn), LPARAM UI)

1-й и 3-й параметры - без проблем, всё понятно, а вот второй...
Что он из себя представляет? И если можно приведите пример такой функции на Delphi.
Большое спасибо.


 
Skier ©   (2003-12-17 11:46) [1]

void (CALLBACK *Fn) - в Delphi это будет процедурой.
т.е. передаётся указатель на процедуру...типичный callback


 
alex_***   (2003-12-17 11:50) [2]

Причем Callback должен быть stdcall, если не ошибаюсь


 
LightKnight ©   (2003-12-17 12:10) [3]

Насколько я всё понял, это будет где-то так
(извините за безграммотность):

//объявляю свою процедуру
procedure MyProcedure; stdcall;
begin
...
end;

...

//вызов функции библиотеки
procedure TFormTop.FormCreate(Sender: TObject);
begin
...
dllFunction(hwnd:HWND, MyProcedure, UI:LPARAM);
...
end;


 
alex_***   (2003-12-17 12:14) [4]

ну типа того. если компилер будет ругаться на MyProcedure, поставь собаку перед ней.


 
KSergey ©   (2003-12-17 12:15) [5]

Если не ошибаюсь, лучше (или даже надо) написать

//вызов функции библиотеки
procedure TFormTop.FormCreate(Sender: TObject);
begin
...
dllFunction(hwnd:HWND, @MyProcedure, UI:LPARAM);
...
end;

Иначе дельфи поймет это как вызов ф-ции.


 
Skier ©   (2003-12-17 12:17) [6]


> Иначе дельфи поймет это как вызов ф-ции.

Уверен ?


 
LightKnight ©   (2003-12-17 12:18) [7]

Спасибо, собака действительно помогла!


 
LightKnight ©   (2003-12-17 12:24) [8]

Кстати по поводу функции...
Если она возвращает Pointer, то никаких проблем.

что-то вроде этого:

function My:pointer; stdcall;
var n: integer;
begin
n := 1;
result := @n;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
i := SetHeaderFooter(Null, My, 0, 1, "str 1");
end;


 
Digitman ©   (2003-12-17 13:16) [9]


> Если она возвращает Pointer, то никаких проблем


а иначе ? какие проблемы тебя беспокоят ?


 
alex_***   (2003-12-17 13:48) [10]

эээ, народ одумайтесь.. возвращать pointer на локальную переменную ?!


 
KSergey ©   (2003-12-17 14:24) [11]

> [6] Skier © (17.12.03 12:17)
>
> > Иначе дельфи поймет это как вызов ф-ции.
>
> Уверен ?

Сказать по-правде - нет ;) Потому и предваряется это все "Если не ошибаюсь" ;)
А проверять лень.

Однако, если честно, я с трудом понимаю как дельфи отличит в данном случае что я хочу: вызвать ф-цию и подставить результат ее выполнения или подставить ее адрес. Если не ошибаюсь, было уже как-то тут обсуждение подобного случая и именно @ позволяла ситуацию разрулить, т.е. чуть ли не документированным моментом являлась.

PS
В любом слове могу ошибаться, ни в чем не уверен ;)


 
alex_***   (2003-12-17 14:28) [12]

я бы сказал не "документированным моментом", а директивой компилеру взять адрес.


 
KSergey ©   (2003-12-17 14:36) [13]

2 [12] alex_*** (17.12.03 14:28)

Да, в данном случае это выглядит логично, но...
На сколько я помню, упомянутое мною обсуждение касалось следующего момента: есть структура (да хоть и переменная!), в которой я сохряняю адрес ф-ции.
При этом если я просто обращусь к переменной, то подразумевается выхов ф-ции.
Однако, что делать, чтобы получить адрес ф-ции? Использовать @переменная? но по логике это вроде адрес переменной... Однако, помнится, это как раз давало адрес ф-ции.

PS
А как же тут тогда получить адрес переменной в памяти? ;)


 
PVOzerski ©   (2003-12-17 15:26) [14]

Логика тут, скажем так, у Борланда своеобразная...
В общем, вот оно как:
{$apptype console}
procedure X;
begin
end;
var
Y:procedure;
begin
Y:=X;
writeln("Точка входа в X: ",longint(@X));
writeln("Точка входа в X, полученная из переменной Y: ",longint(@Y));
writeln("Адрес переменной Y: ",longint(@@Y));
end.



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.028 c
1-99577
not The Vizit0r!
2003-12-17 17:17
2003.12.30
как удалить файл


3-99434
Zhenja
2003-12-04 00:21
2003.12.30
Работа с локальной базой по сети


1-99623
Kvorubin
2003-12-17 09:31
2003.12.30
Полоса прокрутки


1-99606
kasetoff
2003-12-16 16:10
2003.12.30
Редактор тестов


9-99427
SkyRanger
2003-06-10 07:08
2003.12.30
Текстурирование