где TTestEvent — некоторая функция:
TTestEvent=procedure(text:WideString) of object; stdcall;
Так вот интересует, что передается в ф-ию Test (последний параметр), т.е. там написано — "var TE:TTestEvent" , что обозначает "var"? т.е. передается указатель на функцию типа TTestEvent?
Если можно, покажите как будет выглядеть эта функция на C++
Здравствуйте, Dmitry_mit, Вы писали:
DM>Скажем есть процедура:
DM>procedure Test(s:WideString;int:integer;var TE:TTestEvent); stdcall; export;
DM>где TTestEvent — некоторая функция: DM>TTestEvent=procedure(text:WideString) of object; stdcall;
DM>Так вот интересует, что передается в ф-ию Test (последний параметр), т.е. там написано — "var TE:TTestEvent" , что обозначает "var"? т.е. передается указатель на функцию типа TTestEvent?
Передаётся ссылка на функцию.
DM>Если можно, покажите как будет выглядеть эта функция на C++
А тогда как мне описать саму ф-ю (на С), указатель на которую я передаю в ф-ию Test?
Точнее даже как она будет описываться? (содержимое правильное, а описание не верно, точнее я не знаю как оно описывается).
void __fastcall __closure Event(WideString text)
{
Form1->Memo1->Lines->Add(text);
}
Здравствуйте, Sergei, Вы писали:
S>Здравствуйте, Dmitry_mit, Вы писали:
DM>>Скажем есть процедура:
DM>>procedure Test(s:WideString;int:integer;var TE:TTestEvent); stdcall; export;
DM>>где TTestEvent — некоторая функция: DM>>TTestEvent=procedure(text:WideString) of object; stdcall;
DM>>Так вот интересует, что передается в ф-ию Test (последний параметр), т.е. там написано — "var TE:TTestEvent" , что обозначает "var"? т.е. передается указатель на функцию типа TTestEvent? S>Передаётся ссылка на функцию.
DM>>Если можно, покажите как будет выглядеть эта функция на C++
S>
И не будет.
DM>Т.е. интересует как будет описана сама ф-ию, указатель на которую передается в функцию Test.
Надо в классе (например, в классе формы) описать функцию такого вида:
void __fastcall Event(WideString Text);
// далее в cpp-файле:void __fastcall TForm1::Event(WideString Text)
{
// чего-то делаем с Text
}
//вызываем функцию из dll
WideString w = L"Some text";
Test(w, Event);
Здравствуйте, Sergei, Вы писали:
S>Здравствуйте, Dmitry_mit, Вы писали:
DM>>Скажем есть процедура:
DM>>procedure Test(s:WideString;int:integer;var TE:TTestEvent); stdcall; export;
DM>>где TTestEvent — некоторая функция: DM>>TTestEvent=procedure(text:WideString) of object; stdcall;
DM>>Так вот интересует, что передается в ф-ию Test (последний параметр), т.е. там написано — "var TE:TTestEvent" , что обозначает "var"? т.е. передается указатель на функцию типа TTestEvent? S>Передаётся ссылка на функцию.
DM>>Если можно, покажите как будет выглядеть эта функция на C++
S>
Потому, что в паскалевском объявлении функции указано
TTestEvent=procedure(text:WideString) of object
А вообще, вот вам выдержка из хелпа про __closure:
The __closure keyword is used to declare a special type of pointer to a member function. Unlike a regular C++ member function pointer, a closure contains an object pointer.
То есть __closure — это такой специальный тип указателя, который указывает на функцию в экземпляре класса. Это расширение Borland.
Здравствуйте, Flamer, Вы писали:
F>[]
F> DM>>А зачем в описании TTestEvent стоит __closure?
F>Потому, что в паскалевском объявлении функции указано
F> F>
F>TTestEvent=procedure(text:WideString) of object
F>
F>А вообще, вот вам выдержка из хелпа про __closure:
F> F>
F>The __closure keyword is used to declare a special type of pointer to a member function. Unlike a regular C++ member function pointer, a closure contains an object pointer.
F>То есть __closure — это такой специальный тип указателя, который указывает на функцию в экземпляре класса. Это расширение Borland.
Вот когда делаю без __closure и ф-ия Event не является членом класса, то работает а потом появляется ошибка (почти сразу). Т.е. она (Test) обращается к этой ф-ии Event, она срабатывает, а затем ошибка.
А если я делаю __closure и использую функцию член класса, то не работает вообще.
Если кому интересно:
В итоге было почти все правильно:
typedef void __stdcall(__closure *TTestEvent)(WideString text);
extern "C" __declspec(dllexport) void __stdcall Test(WideString s, int i,TTestEvent &TE);
Здравствуйте, Dmitry_mit, Вы писали:
DM>Здравствуйте, Sergei, Вы писали:
S>>Здравствуйте, Dmitry_mit, Вы писали:
DM>>>Скажем есть процедура:
DM>>>procedure Test(s:WideString;int:integer;var TE:TTestEvent); stdcall; export;
DM>>>где TTestEvent — некоторая функция: DM>>>TTestEvent=procedure(text:WideString) of object; stdcall;
DM>>>Так вот интересует, что передается в ф-ию Test (последний параметр), т.е. там написано — "var TE:TTestEvent" , что обозначает "var"? т.е. передается указатель на функцию типа TTestEvent? S>>Передаётся ссылка на функцию.
DM>>>Если можно, покажите как будет выглядеть эта функция на C++
S>>
DM>А компилироваться не хочет... =(
DM>Т.е. интересует как будет описана сама ф-ию, указатель на которую передается в функцию Test.
Спецификатор __closure применим к указателю на метод класса и говорит о том что указатель будет имень размер не 4 а 8 байт — 4:указатель на объект , 4:указатель на метод.