Puntero de función a problemas de función de miembro de clase

En primer lugar, tengo que admitir que mis habilidades de programación son bastante limitadas y me hice cargo de un proyecto C ++ OOP existente (realmente pequeño) donde trato de introducir mis propias cosas. Desafortunadamente, estoy experimentando un problema que va más allá de mi conocimiento y Espero encontrar ayuda aquí. Estoy trabajando con una biblioteca de terceros (que no se puede cambiar) para tomar imágenes de una cámara y usaré algunos nombres de marcador de posición aquí.

La biblioteca de terceros tiene una función "ThirdPartyGrab" para iniciar una captura continua en vivo y toma un puntero a una función que se llamará cada vez que llegue un nuevo marco. Entonces, en una aplicación C normal, es así:

ThirdPartyGrab (HookFunction);

"HookFunction" debe declararse como:

long _stdcall HookFunction (long, long, void*);

o "BUF_HOOK_FUNCTION_PTR" que se declara como

typedef long (_stdcall *HOOK_FUNCTION_PTR) (long, long, void*);

Ahora tengo una aplicación C ++ y una clase "MyFrameGrabber" que debería encapsular todo lo que hago. Así que puse la función de enlace como miembro privado como este:

long _stdcall HookFunction (long, long, void*);

También hay una función pública vacía "StartGrab" en mi clase que debería iniciar el Grab. Por dentro trato de llamar:

ThirdPartyGrab (..., HookFunction, ...);

que (no es sorprendente) falla. Dice que la llamada a la función MyFrameGrabber :: HookFunction pierde la lista de argumentos y debería intentar usar & MyFrameGrabber :: HookFunction para crear un puntero. Sin embargo, pasar "& MyFrameGrabber :: HookFunction" en su lugar da como resultado otro error que no se puede convertir a BUF_HOOK_FUNCTION_PTR.

Después de leer elPunteros de función de preguntas frecuentes de C ++ Creo que entiendo el problema pero no puedo inventar una solución. Traté de hacer que la función de enlace sea estática, pero esto también produce un error de conversión. También pensé en colocar la función de enlace fuera de la clase pero necesito usar funciones de clase dentro de la función de enlace. ¿Hay otra forma o necesito cambiar todo mi concepto?

EDITAR 14.01.08: probé la solución alternativa de singleton ya que no puedo cambiar la biblioteca de terceros y el puntero vacío es solo para los datos que se utilizan dentro de la función de enlace. Desafortunadamente no funcionó de la caja como esperaba ... No sé si la función estática debe estar en una clase separada, así que la puse en mi clase "MyFrameGrabber":

static MyFrameGrabber& instance()
{
        static MyFrameGrabber _instance;
        return _instance;
}
long Hook(long, long, void*); // Implementation is in a separate cpp file

En mi archivo cpp tengo la función call_hook:

long MFTYPE call_hook(long x, MIL_ID y, void MPTYPE *z)
{
    return MyFrameGrabber::instance().Hook(x,y,z);
}
void
MyFrameGrabber::grab ()
{
    ThirdPartyGrab(..., call_hook, ...);
}

Pero esto me da un error enstatic MatroxFrameGrabber _instance; que no se encuentra un constructor estándar coincidente. Eso es correcto porque mi constructor MyFrameGrabber se ve así:

MyFrameGrabber (void* x,
                const std::string &y, int z,
                std::string &zz);

Traté de poner un constructor vacíoMyFrameGrabber(); pero esto da como resultado un error de vinculador. ¿Debo pasar parámetros vacíos al constructor MyFrameGrabber en el singleton? ¿O necesito tener una clase Hook separada y, en caso afirmativo, cómo puedo acceder a las funciones de MyFrameGrabber? Gracias por adelantado.

SEGUNDA EDICIÓN 15.01.08: Apliqué los cambios y ahora compila y enlaza. Desafortunadamente, aún no puedo probar esto en tiempo de ejecución porque es una DLL y todavía no tengo Debug Caller Exe y hay otros problemas durante la inicialización, etc. Marcaré la publicación como respuesta porque estoy seguro de que esta es la forma correcta de hacerlo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta