Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > какой указать в определении callback процедуры


Автор: Гость_Вячеслав 20.3.2005, 18:28
smile

есть dll
вней есть процедура у которой в качестве параметра есть callback процедура

typedef void (__stdcall *init_t) (char*, char*, char*, char*, char*, int, int, int, lcbMsg_t); // вызываемая из dll процедура

typedef void (__stdcall *lcbMsg_t) (char * tmsg, char * msg); // описание callback процедуры

все бы хорошо но надо эту callback процедуру вызвать из MFC шаблона класса:

class CTest3Dlg : public CDialog
{
public:
CTest3Dlg(CWnd* pParent = NULL);

void CALLBACK cbMsg(char *tmsg, char *msg) ; // <= callback процедура

вот тут непонятно как описать в

typedef void ...

предыдущий вариант (typedef void (__stdcall *lcbMsg_t) (char * tmsg, char * msg)) компилятору не нравится

Автор: Олег М 20.3.2005, 18:46
Попробуй сделать её статической
Код

class CTest3Dlg : public CDialog
{
public:
CTest3Dlg(CWnd* pParent = NULL); 

static void CALLBACK cbMsg(char *tmsg, char *msg) ; // <= callback процедура

Иначе не заработает, lcbMsg_t - это указатель на обычную функцияю, а не на метод класса, и шаблоны здесь не причём

Автор: Guest 21.3.2005, 10:12
Цитата
Попробуй сделать её статической

code=cpp]
void CALLBACK CTest3Dlg::cbMsg(char *tmsg, char *msg)
{
CListBox *MyList = (CListBox *) (this->GetDlgItem(IDC_LIST3));
MyList->AddString(msg);
}[
[/code]

Спасибо за оперативный ответ,
сделала как Вы сказали, ругается в нутри самой функции на "this".
Простите мня за мое ламерсво.
Спасибо за помощь!

Автор: Олег М 21.3.2005, 10:19
Цитата(Guest @ 21.3.2005, 10:12)
сделала как Вы сказали, ругается в нутри самой функции на "this".

Для статических функций this не определён. Единственное отличие статических методов от обычных функций состоит в том, что в них можно обращаться к приватным методам и данным своего класса, указатель на объект которого обычно передаётся в фунцию в виде какого-нибудь параметра

Автор: Guest 21.3.2005, 10:46
Цитата
Для статических функций this не определён. Единственное отличие статических методов от обычных функций состоит в том, что в них можно обращаться к приватным методам и данным своего класса, указатель на объект которого обычно передаётся в фунцию в виде какого-нибудь параметра

Еще раз извините за беспокойство.
Спасибо за помощь!!!
Остался еще один вопрос, какой тип имеет "this"

Автор: Guest 21.3.2005, 11:03
получается "замкнутый круг"

Код

CListBox* CTest3Dlg::getLst1()
{
    return (CListBox *) (this->GetDlgItem(IDC_LIST1)); 
}

void CALLBACK CTest3Dlg::cbMsg(char *tmsg, char *msg)  // обозвал как static
{    
      
      CListBox *MyList = (CListBox*) getLst1(); // КОМПИЛЯТОР ПИШЕТ "'CTest3Dlg::getLst1' : illegal call of non-static member function"
      MyList->AddString(msg);
}



как быть ума не приложу smile

Автор: Олег М 21.3.2005, 11:04
Цитата(Guest @ 21.3.2005, 10:46)
Остался еще один вопрос, какой тип имеет "this"

Указатель на класс, в методе которого ты находишься
Добавлено @ 11:07
Нужно указать экземпляр класс CTest3Dlg для которго ты вызываешь getLst1()
Сделай так
Цитата(Guest @ 21.3.2005, 11:03)

void CALLBACK CTest3Dlg::cbMsg(CTest3Dlg* pThis, char *tmsg, char *msg)  // обозвал как static
{   
      if (pThis!=NULL)
{
      CListBox *MyList = (CListBox*) pThis->getLst1();
MyList->AddString(msg);
}
}


Автор: Guest 21.3.2005, 11:15
К сожалению 3 параметр добавить не могу!
эта процедур будет вызваться из dll.
В Dll описана эта callback процедура с двумя параметрами.
smile

Автор: Олег М 21.3.2005, 11:37
Можно ещё так
Код

static CTest3Dlg *_dlg;
CTest3Dlg::CTest3Dlg()
{
_dlg=this;
}
void CALLBACK CTest3Dlg::cbMsg(char *tmsg, char *msg)  // обозвал как static
{    
      if (_dlg!=NULL)
{
      CListBox *MyList = (CListBox*) _dlg->getLst1(); 
MyList->AddString(msg);
}
}

Автор: Guest 21.3.2005, 12:12
компилятору все понравилось, но вот линковщик не удалость обмануть пишет ошибку:

test3Dlg.obj : error LNK2001: unresolved external symbol "public: static class CTest3Dlg * CTest3Dlg::_dlg" (?_dlg@CTest3Dlg@@2PAV1@A)

может с какой нибудь хитрой опцией надо компелить?

Автор: Олег М 21.3.2005, 12:15
Цитата(Guest @ 21.3.2005, 12:12)
компилятору все понравилось, но вот линковщик не удалость обмануть пишет ошибку:

test3Dlg.obj : error LNK2001: unresolved external symbol "public: static class CTest3Dlg * CTest3Dlg::_dlg" (?_dlg@CTest3Dlg@@2PAV1@A)

может с какой нибудь хитрой опцией надо компелить?

smile Нет,убери её из h-файла и напиши в срр-файле, в котором у тебя реализация функций
CTest3Dlg::CTest3Dlg() и

void CALLBACK CTest3Dlg::cbMsg(char *tmsg, char *msg) // обозвал как static
Напиши точно так же как у меня

Автор: Guest 21.3.2005, 13:07
УРА!!!
УРА!!!
УРА!!!

ЗАРАБОТАЛО!!!!!


smile

СПАСИБО!!!!!!!!!!!!!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)