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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top