Форум: "Основная";
Текущий архив: 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