Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
1-99558
azazello
2003-12-18 00:26
2003.12.30
Как добавить 10 строк текста в программу?


3-99502
Sour
2003-12-04 09:12
2003.12.30
Компоненты прямого доступа к IB FIBPlus


3-99444
hursand
2003-12-06 11:32
2003.12.30
Использоват хранимых процедур


1-99542
MisterJ
2003-12-16 10:52
2003.12.30
Delphi5+ExcelXP


1-99543
ksushishka
2003-12-15 14:23
2003.12.30
Программно менять раскладку клавиатуры с русской на английскую





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский