Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> какой указать в определении callback процедуры, какой указать в определении callback 
:(
    Опции темы
Гость_Вячеслав
Дата 20.3.2005, 18:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Попробуй сделать её статической
Код

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

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

Иначе не заработает, lcbMsg_t - это указатель на обычную функцияю, а не на метод класса, и шаблоны здесь не причём
PM MAIL ICQ   Вверх
Guest
Дата 21.3.2005, 10:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Попробуй сделать её статической

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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



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

Для статических функций this не определён. Единственное отличие статических методов от обычных функций состоит в том, что в них можно обращаться к приватным методам и данным своего класса, указатель на объект которого обычно передаётся в фунцию в виде какого-нибудь параметра
PM MAIL ICQ   Вверх
Guest
Дата 21.3.2005, 10:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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

  Вверх
Guest
Дата 21.3.2005, 11:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











получается "замкнутый круг"

Код

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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(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);
}
}


PM MAIL ICQ   Вверх
Guest
Дата 21.3.2005, 11:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

  Вверх
Олег М
Дата 21.3.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Можно ещё так
Код

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);
}
}

PM MAIL ICQ   Вверх
Guest
Дата 21.3.2005, 12:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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

может с какой нибудь хитрой опцией надо компелить?
  Вверх
Олег М
Дата 21.3.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(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
Напиши точно так же как у меня
PM MAIL ICQ   Вверх
Guest
Дата 21.3.2005, 13:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











УРА!!!
УРА!!!
УРА!!!

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


smile

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

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.