информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Ростелеком заподозрили в попытке... 
 Линуксовый ботнет, распространяющийся... 
 Конец поддержки Internet Explorer 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Похоже эта тема выходит за рамки моего понимания. Отложу вникание до тех пор, как доросту. 16.12.08 18:58  Число просмотров: 1484
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
<programming>
[c++] можно ли задвинуть callback-функцию в клас? 10.12.08 04:34   [amirul]
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 10.12.08 04:34  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
Хочу поместить в клас поиск окон при помощи EnumWindows и EnumChildWindows. Потребность в этом вознилка т.к. есть куча вспомогательных переменных (5 штук), которые без использованния класса висят в глобальном определении.

Делаю следующее
class CSearchWnd
{
public:
	CSearchWnd();
	HWND SearchPlanetBoard();
private:
	BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam);
	BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
	BOOL bFound;
	BOOL bMoreOne;
	BOOL bTBoardPanel
	BOOL bTBoardGrid;
	BOOL bTMButtonBoard;
	HWND hwndPlanetBoard;
};

---

Потом в функции SearchPlanetBoard пытаюсь обратиться к EnumWindowsProc:
HWND CSearchWnd::SearchPlanetBoard()
{
	hwndPlanetBoard = NULL;
	EnumWindows(&EnumWindowsProc, 0);
	return hwndPlanetBoard;
}

---
Компилятор ругается, мол "error C2276: '&' : illegal operation on bound member function expression".

Можно ли это как-то вылечить?
Похоже эта тема выходит за рамки моего понимания. Отложу вникание до тех пор, как доросту. 16.12.08 18:58  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Я кстати привел готовый код. Просто компилируешь,... 17.12.08 05:23  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Я кстати привел готовый код. Просто компилируешь, расставляешь брейкпоинты и смотришь как это работает. Там все до примитивности просто, как уже заметил Den
Спасибо, посмотрю. 17.12.08 05:42  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Да все куда проще... 16.12.08 20:17  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
При вызове функции-мембера объекта ака WIN32API CALLBACK , первым неявным параметром твоя функция ожидает указатель THIS на твой объект, который (указатель) WIN32API передать не в состоянии - "это раз".

Второе - функция CALLBACK должна отвечать соглашению вызова STDCALL.
[C++] задвинуть можно 14.12.08 23:08  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Может я и не понял что тебя волнует, но есть обычная техника, которая позволяет подружить калбяки и прочие WINAPI вызовы с так любым сердцу ООП. Можно даже виртуальные функции вызывать:
class My_worker{
	static DWORD WINAPI worker_proc(LPVOID lpParam)
	{
		My_worker& worker =reinterpret_cast<My_workergt;(lpParam);
		...
		worker.work() ;
		return 0;
	}
	virtual bool  work(void)=0;
};

---
Прости если не понял, что ты не понял, и написал что тебе не надо или и так известно.
[C++] Все правильно 15.12.08 03:41  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Только я то же самое уже написал здесь http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=152861 :-)
Сорри, за плагиат. Не суди строго - человеку с около учёным... 15.12.08 06:13  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Только я то же самое уже написал здесь
> http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=
> 152861 :-)
Сорри, за плагиат. Не суди строго - человеку с около учёным прошлым избавиться от плагиата - что курильщику брость курить. Вот я до сих пор ни одного и не могу сделать ;-)
Пара экземплов 10.12.08 10:31  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>


C++ OO Callback Technique
C++ Callback Demo
Это не те коллбэки. Я настаиваю, что в данном случае нужна именно static функция, а не ptr-to-member 10.12.08 11:00  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Пришлось набыдлокодить примерчик:

#include <windows.h>
#include <iostream>

template<typename T, size_t N>
size_t array_size(T (&arr)[N]) {return N;}

class CWinEnumerator {
public:
	CWinEnumerator() {}
	virtual ~CWinEnumerator() {}

	virtual BOOL EnumWindows() {
		return ::EnumWindows(&EnumWndProc, (LPARAM)this);
	}

private:
	static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam) {
		return ((CWinEnumerator *)lParam)->EnumWindowsProc(hwnd);
	}

	virtual BOOL EnumWindowsProc(HWND hwnd) = 0;
};

class CMyWinEnumerator: public CWinEnumerator {
public:
	CMyWinEnumerator() {}
	virtual ~CMyWinEnumerator() {}

private:
	virtual BOOL EnumWindowsProc(HWND hwnd) {
		WCHAR text[1024];
		::GetWindowText(hwnd, text, (int)array_size(text));
		std::wcout << text << std::endl;
		return TRUE;
	}
};

int
main() {
	CMyWinEnumerator enumerator;
	enumerator.EnumWindows();

	return 0;
}

---
Да, я просто увидел, что "надо поместить в класс" и подумал об объектах 10.12.08 11:19  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
А сам пост ничитал.
[C++] static (->beginners) 10.12.08 08:53  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
[C++] Если функцию статиком обозвать, то и переменные тоже придётся, а надо чтобы в разных экзмеплярах класса они разные были, поэтому статик не пойдёт. 10.12.08 11:55  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
[C++] Пойдет-пойдет. Еще как пойдет 10.12.08 11:59  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Это только для SetTimer и прочих вызовов, которые не позволяют передать opaque указатель нужно городить отдельный огород (в самых запущенных случаях - приходится генерить заглушки для каждого коллбека, чтоб хоть как то их отличать). А в случае EnumWindows - все тривиально.
Если тривиально, то приведённый мной выше код должен... 11.12.08 12:20  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Если тривиально, то приведённый мной выше код должен работать, а он не работает.
Эх. Вот этим и отличается понимание от зазубривания 11.12.08 21:17  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Если тривиально, то приведённый мной выше код должен
> работать, а он не работает.

Не должен он работать. Даже если не закапываться в дебри стандартов и несовместимых calling convention-ов, то просто банальная логика должна подсказать, что нестатический метод класса ВСЕГДА вызывается для какого либо объекта. Причем объект этот при вызове метода из внешнего по отношению к классу кода ВСЕГДА указывается ЯВНО. Для какого объекта будет вызываться метод в случае с коллбеком?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach