Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

viernes, 2 de septiembre de 2016

Cómo evitar que C++ decore los nombres de las funciones de una dll

Agradezco la ayuda a:
http://stackoverflow.com/q/2804893
http://stackoverflow.com/q/1467144

Mi caso era que estaba compilando una dll en c++ con Visual Studio Express 2013 y encontré que, al intentar invocarla desde otra aplicación, el compilador decoraba los nombres de las funciones.
Para evitarlo, se deben declarar las funciones con extern "C":

En el archivo  .h:

extern "C" __declspec (dllexport) long SomeFunction(int param);

Y en el archivo .cpp respectivo:

extern "C" 
__declspec (dllexport) long SomeFunction(int param)
{
    return _somethingIwantToDo(param);
}


si se está depurando, es mejor dejar la opción de "Generar Información de Depuración" en "Si" o el depurador empezará a protestar:

Esto es mejor dejarlo en "Si".

Al colocar  extern "C" el compilador ya no decora los nombres de las funciones aunque la convención de llamada sea stdcall o cdecl:

 
Eso sí, la convención de llamada de la dll y la aplicación que la invoca debe ser la misma, o el compilador arrojará el error LNK2019 y de paso el LNK1120:


No hay comentarios: