Pregunta

Aquí está el problema. Mis llamadas de aplicación CoCreateInstance() para crear un objeto COM implementado en una DLL de terceros. Eso llamadas DLL set_terminate() para cambiar el controlador de terminate() y pasa una dirección de su propio manejador terminate() allí.

La dirección inicial manejador terminate() no es salvado por esa biblioteca - que no le importa y simplemente cambia el manejador y nunca lo restaura. Tan pronto como el archivo DLL se descargó su código ya no está en la memoria del proceso, por lo que si ahora terminate() se llama el programa se ejecuta en un comportamiento indefinido.

Me gustaría recuperar y almacenar la dirección del manejador inicial terminate() para poder restaurarlo. ¿Cómo puedo hacerlo?

¿Fue útil?

Solución

estándar de C ++ no proporciona ninguna manera integrada.

Por supuesto, usted podría llamar a cancelar () dos veces : primera vez con cualquier manejador de maniquí que tiene (y luego manejador tienda que terminar () que regresó); En segundo lugar - para restaurar el controlador que acaba de almacenado;.) simple truco

Otros consejos

En C ++ 11 se llama a std :: get_terminate.

¿Quieres decir algo como esto:

terminate_handler oldHandler;

void onDllLoad()
{
    oldHandler = set_terminate (newHandler);
}

void onDllUnload()
{
    set_terminate (oldHandler);
}

void newHandler()
{
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top