Проблема с использованием функтора заключается в соглашении о вызовах: Windows ожидает, что адрес будет адресом статической функции, и будет использовать / вызывать этот адрес как таковой; тогда как «this», которое вы передаете, не является адресом статической функции.
Windows будет использовать адрес, подобный этому (псевдокодированная сборка):
; push the necessary parameters
push [hWnd]
push etc...
; invoke the specified address (of the static function)
call [callback]
Чтобы вызвать функтор, код Windows должен быть таким:
; push the necessary parameters
push [hWnd]
push etc...
; invoke the specified address (of the functor object)
; ... first, put the 'this' pointer as a hidden parameter into the ecx register
mov ecx,[callback]
; ... next, invoke the address (where is it?) of the class' functor method
call MyWinProc::operator()
... или вместо двух последних операторов следующие операторы, если оператор виртуальный ...
; ... first, put the 'this' pointer as a hidden parameter into the ecx register
mov ecx,[callback]
; ... next, invoke the address of the operator via an (which?) entry
; in the class' vtable
call [ecx+8]
Ничего из этого невозможно, поскольку O / S не знает соглашений о вызовах для нестатических методов C ++, особенно включая:
- Способ, которым передается неявный параметр "this"
- Адрес класса не-виртуальных методов
- Записи vtable виртуальных методов класса