Estoy trabajando en una aplicación escrita en Visual Studio 6 (lo sé, FML) que está llamando funciones en una DLL usando LoadLibrary
y GetProcAddress
. El código más nuevo no puede compilarse en VC6 y necesita un compilador más nuevo. La DLL tiene algunas funciones que construyen un objeto C++, y luego el programa VC6 usa el objeto a través de una clase abstracta.¿Cómo puede manejar MSVC6 las excepciones de las funciones externas "C"?
Esto funciona muy bien por lo general, pero tiene problemas cuando las funciones recuperadas por GetProcAddress
arrojan excepciones, incluso cuando las excepciones están atrapadas dentro de la DLL. Me di cuenta de que esto no ocurre cuando los métodos de la clase abstracta arrojan una excepción. Las cosas funcionan normalmente en ese caso.
¿Qué estoy haciendo mal aquí? ¿Cómo puedo hacer que VC6 genere código para manejar las excepciones correctamente?
Editar: He aquí un ejemplo de una función que hace que el programa se bloquee:
extern "C" __declspec(dllexport) Box* getBox(const char* addr)
{
try {
return createBox(addr);
} catch (std::exception& ex) {
LOG_ERROR("Open failed: " << ex.what());
return 0;
} catch (...) {
LOG_ERROR("Error while opening.");
return 0;
}
}
¿Están todos los módulos utilizando la misma instancia del tiempo de ejecución de msvc? –
No lo son y ese es el problema. –
@Brian ¿Tiene atrapar todos los controladores en la DLL? ¿Podemos ver un ejemplo de uno de esos controladores que no detecta una excepción? –