none
Como enlazar una librería dinámica (DLL) RRS feed

  • Pregunta

  • Hola a todos:

    Estoy portando un proyecto Windows desarrollado en C++ con minGW a Visual C++, pero soy completamente nuevo en esta plataforma.

    Estoy utilizando Visual C++ 2008 Express Edition, y el problema es que no encuentro en que parte de la configuración debo incluir el nombre de la librería (.DLL) que utilizo en el proyecto (repasando las opciones de configuración he encontrado referencias a carga retrasada, pero no a la carga normal).  Lo que pretendo es enlazar la librería dinámica con carga estática (enlazada estáticamente).

    Os quedaría muy agradecido si podeis indicarme en qué apartado debo incluir el nombre de la librería.

    Saludos.

    Adolfo.

    miércoles, 14 de mayo de 2008 22:13

Respuestas

  • Ahora sí, je je.

     

    En las opciones del proyecto, pestaña Linker -> Input -> Additional Dependencies has de colocar no el .def, sino el .lib de importación.

     

    EL fichero de definición (def) no sirve para enlazar la biblioteca, tienes que generar el .lib a partir de la dll y el def con, si no me falla la memoria, "implib".

     

    Luego, donde quieras usar las funciones de la misma, incluyes es cabecera con los __dllexport y listo.

     

    jueves, 15 de mayo de 2008 13:46
    Moderador

Todas las respuestas

  • No puedes enlazar estáticamente una DLL si no tienes el código fuente (es decir, coger la DLL y tu programa y convertirlo en un solo fichero). Lo que sí puedes hacer es o bien cargar la DLL de forma dinámica y a mano o de forma automática.

     

    La primera forma es bastante complicada, ya que requiere que asignes cada función a mano a un puntero a función. Algo así:

     

    Code Snippet

    HRESULT (FAR STDAPICALLTYPE * Open) (void);

     

    m_hLib=LoadLibrary(L"C:\\Windows\\System32\\UnaDLL.DLL");

    if(m_hLib==NULL)

    {

    ::MessageBox(NULL,L"La DLL no se pudo encontrar.",L"Carga de DLL",MB_ICONERROR);

    return;

    }

    (FARPROC&)Open = GetProcAddress(m_hLib, "Open");

     

     

    La otra forma es obtener el fichero cabecera y el .lib de importación de la DLL y usar las funciones de la misma como si de funciones normales se tratara. Para ver cómo funciona esto, créate un proyecto Win32 que sea una DLL desde el Visual Studio y verás cómo funciona.

    jueves, 15 de mayo de 2008 8:20
    Moderador
  • RFOG:

    Gracias por tu respuesta, pero creo que no me he explicado adecuadamente.

    Mi problema no es la teoría, sino la práctica.  Como he indicado anteriormente, se trata de pasar a "Visual" un proyecto que *ya* funciona en Windows (compilado con GNU gcc).  Actualmente el proyecto consiste en un .exe (del que tengo los fuentes) y una librería xxxx.dll de la que tengo también el fichero de exportación xxxx.def.

    Lo que pretendo es enlazar la DLL con mi proyecto en la forma que tu llamas "automática".  Es decir, suponiendo que tengo los fuentes del proyecto, la correspondiente DLL y su fichero de definición xxxxx.def, en qué parte del fichero de configuración del proyecto debo poner que debe utilizar la librería xxxxx.dll

    Saludos.

    jueves, 15 de mayo de 2008 9:05
  • Ahora sí, je je.

     

    En las opciones del proyecto, pestaña Linker -> Input -> Additional Dependencies has de colocar no el .def, sino el .lib de importación.

     

    EL fichero de definición (def) no sirve para enlazar la biblioteca, tienes que generar el .lib a partir de la dll y el def con, si no me falla la memoria, "implib".

     

    Luego, donde quieras usar las funciones de la misma, incluyes es cabecera con los __dllexport y listo.

     

    jueves, 15 de mayo de 2008 13:46
    Moderador
  • Nuevamente gracias.

    Efectivamente, "ahora sí", y efectivamente, la utilidad implib permite crear un fichero de importación.  El problema es que ahora no consigo generar el fichero .LIB adecuado para este J@#!!**... Visual.

    Estoy utilizando el implib que viene con el compilador de Borland y he hecho pruebas de generar el .LIB desde un fichero .DEF y desde el DLL directamente, pero en ningún caso he conseguido crear un .LIB correcto.  El "linkeer" genera siempre el error:

    xxxxx.lib : fatal error LNK1136: archivo no válido o dañado

    Creo que tendé que crear otro hilo para ver si alguien sabe cual es el truco o si MSVC tiene alguna utilidad para crear el .LIB a partir de la DLL.

    Saludos.


    jueves, 15 de mayo de 2008 22:21
  • Es que me equivoqué... el implib es para el formato de Borland, no para el de Microsoft. En fin.

     

    Si estás generando la DLL desde el Visual Studio, te debe estar generando ya el .lib de importación.

     

    De todos modos, aquí tienes cómo generar el lib de importación con las herramientas de Microsoft:

     

    http://support.microsoft.com/kb/q131313/
    viernes, 16 de mayo de 2008 8:23
    Moderador