кривая функция и var
От: Dmitry_mit  
Дата: 20.11.02 16:56
Оценка:
Скажем есть процедура:

procedure Test(s:WideString;int:integer;var TE:TTestEvent); stdcall; export;

где TTestEvent — некоторая функция:
TTestEvent=procedure(text:WideString) of object; stdcall;

Так вот интересует, что передается в ф-ию Test (последний параметр), т.е. там написано — "var TE:TTestEvent" , что обозначает "var"? т.е. передается указатель на функцию типа TTestEvent?

Если можно, покажите как будет выглядеть эта функция на C++
Re: кривая функция и var
От: Sergei  
Дата: 20.11.02 17:36
Оценка:
Здравствуйте, 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++


typedef void __fastcall (__closure *TTestEvent)(WideString text);

extern "C" __declspec(dllexport) void _stdcall Test(WideString s,TTestEvent& TE)
{
}
Re[2]: кривая функция и var
От: Dmitry_mit  
Дата: 20.11.02 17:49
Оценка:
Здравствуйте, Sergei, Вы писали:

S>
S>typedef void __fastcall (__closure *TTestEvent)(WideString text);

S>extern "C" __declspec(dllexport) void _stdcall Test(WideString s,TTestEvent& TE)
S>{
S>}
S>


А тогда как мне описать саму ф-ю (на С), указатель на которую я передаю в ф-ию Test?

Точнее даже как она будет описываться? (содержимое правильное, а описание не верно, точнее я не знаю как оно описывается).
void __fastcall __closure Event(WideString text)
{
Form1->Memo1->Lines->Add(text);
}

Заранее спасибо.
Re[2]: кривая функция и var
От: Dmitry_mit  
Дата: 20.11.02 17:52
Оценка:
Здравствуйте, Sergei, Вы писали:


S>
S>typedef void __fastcall (__closure *TTestEvent)(WideString text);

S>extern "C" __declspec(dllexport) void _stdcall Test(WideString s,TTestEvent& TE)
S>{
S>}
S>


А как будет выглядеть сама ф-ию типа TTestEvent?

её содержимое —

{
        Form1->Memo1->Lines->Add(text);
}


А вот какой заголовок (прототип) — я не знаю =((

Я пробовал так, но не хочет компилироваться:

void __fastcall (__closure) Event(WideString text)
{
        Form1->Memo1->Lines->Add(text);
}


Заранее огромное спасибо!
Re[2]: кривая функция и var
От: Dmitry_mit  
Дата: 20.11.02 18:03
Оценка:
Здравствуйте, 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>
S>typedef void __fastcall (__closure *TTestEvent)(WideString text);

S>extern "C" __declspec(dllexport) void _stdcall Test(WideString s,TTestEvent& TE)
S>{
S>}
S>


А как будет описываться сама ф-ию (т.е. ее прототип)?
Я пишу —

void _fastcall (__closure)Event(WideString text)
{
}


А компилироваться не хочет... =(

Т.е. интересует как будет описана сама ф-ию, указатель на которую передается в функцию Test.
Re[3]: кривая функция и var
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 20.11.02 18:16
Оценка: 8 (1)
Здравствуйте, Dmitry_mit, Вы писали:



[skipped]


DM>А компилироваться не хочет... =(


И не будет.

DM>Т.е. интересует как будет описана сама ф-ию, указатель на которую передается в функцию Test.


Надо в классе (например, в классе формы) описать функцию такого вида:


void __fastcall Event(WideString Text);

// далее в cpp-файле:

void __fastcall TForm1::Event(WideString Text)
{
// чего-то делаем с Text
}

//вызываем функцию из dll
WideString w = L"Some text";
Test(w, Event);


В общем, попробуйте так...
Re[2]: кривая функция и var
От: Dmitry_mit  
Дата: 20.11.02 18:25
Оценка:
Здравствуйте, 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>
S>typedef void __fastcall (__closure *TTestEvent)(WideString text);

S>extern "C" __declspec(dllexport) void _stdcall Test(WideString s,TTestEvent& TE)
S>{
S>}
S>


А зачем в описании TTestEvent стоит __closure?
Re[3]: кривая функция и var
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 20.11.02 18:29
Оценка:
[]


DM>А зачем в описании TTestEvent стоит __closure?


Потому, что в паскалевском объявлении функции указано


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.
Re[4]: кривая функция и var
От: DmitryM12  
Дата: 20.11.02 18:35
Оценка:
Здравствуйте, 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 и использую функцию член класса, то не работает вообще.
Re[5]: кривая функция и var
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 20.11.02 18:51
Оценка:
Здравствуйте, DmitryM12, Вы писали:

[]

DM>А если я делаю __closure и использую функцию член класса, то не работает вообще.


Попробуйте заменить __fastcall на __stdcall — суду по приведенному вами прототипу функции на Паскале, должно быть так.
Re: Спасибо всем кто ответил!
От: DmitryM12  
Дата: 20.11.02 18:51
Оценка:
Спасибо всем! У меня все заработало.

Если кому интересно:
В итоге было почти все правильно:
typedef void __stdcall(__closure *TTestEvent)(WideString text);
extern "C" __declspec(dllexport) void __stdcall Test(WideString s, int i,TTestEvent &TE);
Re[3]: кривая функция и var
От: Klestov  
Дата: 23.11.02 16:49
Оценка:
Здравствуйте, 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>>
S>>typedef void __fastcall (__closure *TTestEvent)(WideString text);

S>>extern "C" __declspec(dllexport) void _stdcall Test(WideString s,TTestEvent& TE)
S>>{
S>>}
S>>


DM>А как будет описываться сама ф-ию (т.е. ее прототип)?

DM>Я пишу -

DM>
DM>void _fastcall (__closure)Event(WideString text)
DM>{
DM>}
DM>


DM>А компилироваться не хочет... =(


DM>Т.е. интересует как будет описана сама ф-ию, указатель на которую передается в функцию Test.


Спецификатор __closure применим к указателю на метод класса и говорит о том что указатель будет имень размер не 4 а 8 байт — 4:указатель на объект , 4:указатель на метод.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.