none
Dll en Visual C++ .NET RRS feed

  • Pregunta

  • Hola,

    Me gustaría poder usar las funciones de una dll en mi programa escrito en Visual C++ .Net.

    El fabricante proporciona la dll con ejemplos para C/C++ y C# pero al llamarla desde mi código me da error. Además tengo el fichero .h con las funciones de la dll.

    Os dejo un ejemplo de una función para explicarme mejor.

    La función en el .h está declara como;


    #ifdef __cplusplus
    extern "C" {
    #endif

    ....

    unsigned  int __stdcall SglAuthentB(
      unsigned  int   *LibRandNum );

    ...

    #ifdef __cplusplus
    }
    #endif

     

    Esta función se llama desde C# así:

    [DllImport("sglw32.dll")]   public static extern UInt32 SglAuthentB([Out] UInt32[] LibRandNum);

     

    Yo he intentado llamarla desde C++ así:

    [ DllImport("SglW32.dll", EntryPoint = "?SglAuthentB@@$$J14YGIPAI@Z")] static unsigned int SglAuthentB(unsigned int *LibRandNum);

     

    Pero me da el siguiente error:

    1>Demo.obj : error LNK2028: se hace referencia al símbolo (token) sin resolver (0A000021) "extern "C" unsigned int __stdcall SglAuthentB(unsigned int *)" (?SglAuthentB@@$$J14YGIPAI@Z) en la función "extern "C" unsigned int __clrcall SglAuthent(unsigned int *)" (?SglAuthent@@$$J0YMIPAI@Z)

     

    La función SglAuthent es otra similar que también se importa con DllImport...

     

    ¿Alguna idea de cómo puedo usar la dll?

    Gracias!!!

     

     


    Liiid
    martes, 17 de enero de 2012 15:20

Respuestas

  • Debes quitar el "name mangled" de la declaración de la importación, porque es una función de C, no de C++:

    [ DllImport("SglW32.dll", static unsigned int SglAuthentB(unsigned int *LibRandNum);

    Y de hecho tampoco es imprescindible, ya que simplemente con incluir el fichero cabecera de la DLL en tu fuente en C++/CLI, podrás hacer la llamada directamente sin mayor complicación gracias al IJW (a no ser que tengas el C++/CLI como PURE).


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    • Marcado como respuesta Liiid miércoles, 18 de enero de 2012 14:41
    miércoles, 18 de enero de 2012 11:56
    Moderador

Todas las respuestas

  • Debes quitar el "name mangled" de la declaración de la importación, porque es una función de C, no de C++:

    [ DllImport("SglW32.dll", static unsigned int SglAuthentB(unsigned int *LibRandNum);

    Y de hecho tampoco es imprescindible, ya que simplemente con incluir el fichero cabecera de la DLL en tu fuente en C++/CLI, podrás hacer la llamada directamente sin mayor complicación gracias al IJW (a no ser que tengas el C++/CLI como PURE).


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    • Marcado como respuesta Liiid miércoles, 18 de enero de 2012 14:41
    miércoles, 18 de enero de 2012 11:56
    Moderador
  • El fichero de cabecera no lo puedo llamar porque tengo C++/CLI como pure.

    Pero ya he conseguido importar la dll quitando el "name mangled".

     

    Gracias!


    Liiid
    miércoles, 18 de enero de 2012 14:41