2011-09-20 8 views
5

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; 
    } 
} 
+2

¿Están todos los módulos utilizando la misma instancia del tiempo de ejecución de msvc? –

+2

No lo son y ese es el problema. –

+0

@Brian ¿Tiene atrapar todos los controladores en la DLL? ¿Podemos ver un ejemplo de uno de esos controladores que no detecta una excepción? –

Respuesta

1

No se puede hacer de herencia versiones de compiladores cruzados por el estilo. Casi funciona, pero las excepciones y algunas otras cosas se vuelven locas.

+1

y es por eso Siempre digo que si su dll va a vivir mucho tiempo, debe limitar la interfaz pública a C, no C++. – rodrigo

+1

El problema aquí no está en la interfaz. El problema es que las excepciones _internal al DLL_ son caus el programa para abortar antes de que se capturen las excepciones. Las excepciones no están destinadas a cruzar el límite de la DLL, deben ser lanzadas y atrapadas por completo dentro del código DLL. – Brian

+0

El problema es que la compatibilidad ABI se ha roto de una manera que confunde el tiempo de ejecución. – Joshua

Cuestiones relacionadas