C ++: puntero a un método de clase
Pregunta
Tengo que configurar un puntero a una función de biblioteca (IHTMLDocument2::write
) que es un método de la clase IHTMLDocument2
. (para los curiosos: tengo que conectar esa función con Detours)
No puedo hacer esto directamente, debido a la falta de coincidencia de tipos, tampoco puedo usar una conversión (reinterpret_cast<>
que es el " correcto " afaik no funciona)
Esto es lo que estoy haciendo:
HRESULT (WINAPI *Real_IHTMLDocument2_write)(SAFEARRAY *) = &IHTMLDocument2::write
¡Gracias por tu ayuda!
Solución
El puntero para funcionar tiene el siguiente tipo:
HRESULT (WINAPI IHTMLDocument2::*)(SAFEARRAY*)
Como puede ver, está calificado con su nombre de clase. Requiere una instancia de una clase para llamar (porque no es una función estática):
typedef HRESULT (WINAPI IHTMLDocument2::*DocumentWriter)(SAFEARRAY*);
DocumentWriter writeFunction = &IHTMLDocument2::write;
IHTMLDocument2 someDocument = /* Get an instance */;
IHTMLDocument2 *someDocumentPointer = /* Get an instance */;
(someDocument.*writefunction)(/* blah */);
(someDocumentPointer->*writefunction)(/* blah */);
Otros consejos
Debe usar un puntero de función de miembro . Un puntero de función normal no funcionará, porque cuando llama a una función miembro de clase (no estática) hay un puntero this
implícito que se refiere a una instancia de la clase.