none
Usar función de DLL externa RRS feed

  • Pregunta

  • Buenas

    Estoy intentado migrar una aplicacion de VB6 a c# y estoy teniendo grabes problemas al intentar usar una dll ya que me está siendo imposible invocar las funciones de esta dll, las cuales en vb6 están funcionando sin problema.

    Ahora mismo en c# tengo esto:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
          public struct A3GAPError
          {
              [MarshalAs(UnmanagedType.TBStr, SizeConst = 7)]
              public string CodigoError;
              [MarshalAs(UnmanagedType.TBStr, SizeConst = 70)]
              public string DescripcionError;
     
          };
    

    [DllImport("C:\\marta\\A3\\A3ECO\\A3GAPEXT.DLL", EntryPoint = "A3GAPPosicionar", ExactSpelling = true, SetLastError = true)]
       public static extern void _FuncA3GAPPosicionar(string Path, ref A3GAPError DatosErrorlkg);

    Pero al llamar a esta funcion:

    string rutaDll = "C:\\marta\\A3\\A3ECO\\A3GAPEXT.DLL";
    _FuncA3GAPPosicionar(rutaDll ref _A3GAPError);

    Me salta el siguiente error:

    Alguna idea de que puedo estar haciendo mal?

    Un saludo!

                   
                   
    martes, 29 de marzo de 2016 11:42

Respuestas

Todas las respuestas

  • hola

    la libreria que intentas invocar fue creada en VB6 o en C++ ?

    lo pregunto porque por el mensaje parece ser que hay librerias que deberias registrar con el comando regsvr32.exe para que ingresen en la registry de windows

     Cómo utilizar la herramienta Regsvr32 y solucionar problemas de mensajes de error de Regsvr32

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 29 de marzo de 2016 11:57
  • Buenas, la verdad que no se en que fue creada ya que es una librería externa a mi y de la cual no me dan acceso a mas información. Además en la documentación que me dieron no aparece nada sobre en que lenguaje está hecho.

    Aun así por lo que he podido investigar, creo que está hecha en COBOL.

    martes, 29 de marzo de 2016 15:13
  • >>la verdad que no se en que fue creada ya que es una librería externa a mi y de la cual no me dan acceso a mas información

    intentaste agregarla por medio de una reference en tu proyecto

    si es una libreria COM se podria generar la Interop para usarla directo en .net

    busca la dll, si es una libreria c++ te mostrara un mensaje indicandolo, con esto al menos descarta si fue creada en VB6 o no

    >>Aun así por lo que he podido investigar, creo que está hecha en COBOL.

    me suena raro que en COBOL se puedan crear dll

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 29 de marzo de 2016 15:26
  • Que tal si nos pasas la declaracion de la función, tal como la haces en vb. 

    martes, 29 de marzo de 2016 15:34
  • ¿Te indicaría qué cosa?

    el 99.67% de las bibliotecas COM comerciales están escritas en C++ (el 98.53% de ellas con VS/ATL).

    martes, 29 de marzo de 2016 15:36
  • Ya intetne registrar la libreria con el Regsrv32 y me daba este error:

    También intente agregarla como COM, pero la librería no es COM y me daba error.

    En el programa de vb6 esta así:

    Public Declare Sub A3GAPPosicionar Lib "A3GAPEXT.DLL" (ByVal Path As String, DatosErrorlkg As A3GAPError)

        

    Type A3GAPAbrir
        CodigoEmpresalkg As String * 5
        Actividadlkg     As String * 2
        Ejerciciolkg     As String * 4
    End Type

    '********** Descripción de las líneas del apunte ********
    Type A3GAPApunte
       TipoIMU       As String * 1
       Operacion     As String * 1
       FechaApunte   As String * 8
       FechaNueva    As String * 8
       TipoApunte    As String * 1
       OrigenApunte  As String * 1
       NumOrden      As String * 4
       TipoImporte   As String * 1
       Cuenta        As String * 12
       Importe       As String * 15
       Descripcion   As String * 30
       Documento     As String * 10
       VaAIVA        As String * 1
       CuotaIva      As String * 15
       CuotaRec      As String * 15
       CuotaRet      As String * 15
       PorIva        As String * 5
       PorRec        As String * 5
       PorRet        As String * 5
       NroFactura    As String * 10
       FraAbono      As String * 1
       Impreso       As String * 4
       OperacionIVA  As String * 2
       ProductoIVA   As String * 2
       RefAnalitica  As String * 3
       BaseIva       As String * 15
       RefInterna    As String * 8
       Reserva       As String * 24
    End Type

    '*************** Descripción de errores *****************
    Type A3GAPError
        CodigoError      As String * 2
        DescripcionError As String * 70
    End Type

    Y la llamada:

    'cargamos la dll a tratar
            CargarDll (eRutaAplicacion)
            If Error Then
                'error de dll
                Avisos = "Error de carga de Dll."
                PresentarMensaje (Avisos)
                Exit Sub
            End If
            
            'nos posicionamos
            PathEcolkg = eRutaAplicacion + Chr$(0)
            A3GAPPosicionar PathEcolkg, GAPError
            
            If GAPError.CodigoError <> "00" Then
                'error de posicionamiento dll
                Avisos = GAPError.DescripcionError
                PresentarMensaje (Avisos)
                Exit Sub
            End If
            

    martes, 29 de marzo de 2016 15:42
  • se me había olvidado poner el contenido de la funcion cargarDLL en vb6:

    Private Function CargarDll(Camino_Aplicacion As String) As Boolean
        Dim Resultado As Long
        Dim CaminoDll As String
        
        CargarDllVencimientos = False
        CaminoDll = Camino_Aplicacion
        
        If Mid(CaminoDll, Len(CaminoDll), 1) <> "\" Then
            CaminoDll = CaminoDll + "\"
        End If
        CaminoDll = CaminoDll + "A3GAPEXT.DLL"

        Resultado = SetEnvironmentVariable("COBDIR", Camino_Aplicacion)
        If Resultado <> 0 Then
            Resultado = SetEnvironmentVariable("COBSW", "+B-N-F")
            If Resultado <> 0 Then
                HandleDllCobol = LoadLibrary(CaminoDll)
                If HandleDllCobol <> 0 Then
                    CargarDll = True
                    Error = False
                Else
                    Error = True
                End If
            End If
        End If
    End Function

    martes, 29 de marzo de 2016 15:46
  • ok entonces esta claro que no es una liberia COM creada en VB6

    entonces si debes usar el [DllImports]

    Tutorial de invocación de la plataforma

    pero no definas una ruta a la dll, sino que copia esta en el system32 de windows

    [DllImport("A3GAPEXT.DLL")]
    public static extern void A3GAPPosicionar (string Path, A3GAPError DatosErrorlkg);


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 29 de marzo de 2016 15:53
  • Le hecho un ojo y pruebo con esto, pero me parece que es mas o menos lo que tengo 
    martes, 29 de marzo de 2016 16:28
  • si seguro el codigo sea similar, pero comenta dos puntos importantes

    - ubica la dll en el system32 de windows

    - no definas una ruta el el [DllImport]

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta miguel_remirez jueves, 31 de marzo de 2016 15:50
    martes, 29 de marzo de 2016 16:39
  • Para que quede claro, regsvr32.exe registra en el registro de Windows los elementos COM de un DLL (OCX, etc.) que tenga un entry point para una función llamada DllRegisterServer().  Pero esto solamente es necesario para usar COM, cosa que usted no está intentando usar.

    Ahora el código de VB que usted muestra:  Es el uso de la función de Windows LoadLibrary().  ¿Por qué muestra este código y no tiene un equivalente en C#?  ¿O sí lo tiene y no nos lo muestra?  En todo caso, nótese que declarar la función con extern hace el uso de LoadLibrary() innecesario y por lo tanto el código que muestra, innecesario.

    Lo que sería bueno que nos muestre más bien es el Declare de la función en VB clásico.

    Ah, y también existe una aplicación llamada Dependency Walker que le mostrará los entry points de todas las funciones publicadas en cualquier DLL, así como las dependencias a otros DLL's.


    Jose R. MCP
    Code Samples

    martes, 29 de marzo de 2016 16:41
    Moderador
  • Hola.

    Después de 4 años yo me encuentro en una situación similar. ¿Pudiste encontrar una solución?

    Sería una gran ayuda si no tuviese que desempolvar VB6 después de más de 10 años de no usarlo.

    lunes, 13 de julio de 2020 1:45