none
Cómo usar un proyecto activex dll en un proyecto standard exe RRS feed

  • Pregunta

  • Hola a todos,

    tengo un proyecto activex dll (con una clase definida) y necesito poder ejecutarlo desde un exe para poder depurarlo.

    Supong que tendré que hacer un createobject para crear un objeto de esa clase pero no se cómo hacerlo.

    ¿Hay que importar esa clase en el exe? ¿Alguien me puede ayudar?

    Gracias de antemano.

    Saludos.

    miércoles, 4 de septiembre de 2013 15:36

Respuestas

  • Quita la linea theBascula.InputLen = 0 y pone este código para ver que te manda la báscula:

    If Len(cadena_ok) > 0 Then

         ' Quita las dos lineas de momento
          '   On Error Resume Next
          '   PesoBascula = CDbl(cadena_ok)

    msgbox PesoBascula
    End If


    Saludos, Javier J

    • Marcado como respuesta droig viernes, 20 de septiembre de 2013 10:41
    lunes, 9 de septiembre de 2013 15:43

Todas las respuestas

  • Para usar la Dll en tu proyecto debes empezar por entrar en Referencias y añadir la referencia a la dll en cuestión.

    Luego, en el código creas la instancia con algo como 

    Dim miObjecto as New miClase


    Saludos, Javier J

    • Propuesto como respuesta Sergio Parra jueves, 5 de septiembre de 2013 7:41
    jueves, 5 de septiembre de 2013 7:15
  • Gracias Javier por la aclaración.

    Cuando depuro la aplicación, ¿es posible poner un breakpoint dentro de la dll? o ¿al depurar paso a paso puedo entrar dentro del código de la dll para ver lo que hace?

    Saludos.

    jueves, 5 de septiembre de 2013 8:59
  • Si la dll es externa no puedes ejecutarla paso a paso en depuración.

    Si tienes el código y está en VB puedes incluir el código de la clase dentro de tu proyecto para depurarla.


    Saludos, Javier J

    jueves, 5 de septiembre de 2013 9:20
  • Dentro de la dll tengo creado una función a la que le paso un entero y me devuelver un double.

    No encuentro ejemplos y por lo que sea lo estoy haciendo mal. ¿Me puedes decir cómo se crearía y se llamaría a la función? o ¿alguna página con códigos de ejemplo?

    Gracias y perdona las molestias.

    jueves, 5 de septiembre de 2013 14:00
  • Javier,

    si lo pongo de ese modo me da un error de compilación y me dice: "Se esperaba un tipo definido por el usuario no un proyecto"..

    jueves, 5 de septiembre de 2013 14:03
  • Eso ocurre cuando le das el mismo nombre a la clase (o al módulo) que al procedimiento o función.
    Si por ejemplo estás creando una clase MiClase no puedes darle ese nombre a la propio módulo de clase en el entorno de desarrollo.

    Saludos, Javier J

    jueves, 5 de septiembre de 2013 15:19
  • Hola Javier,

    perdona pero dentro de las referencias no soy capaz de encontrar el control mscomm.ocx que me hace falta.

    ¿Me puedes decir cuál es?

    Mil gracias.

    viernes, 6 de septiembre de 2013 9:23
  • Lo puedes descargar desde aquí

    Aquí tienes documentación Cómo usar el MSCOMM32.OCX


    Saludos, Javier J

    viernes, 6 de septiembre de 2013 11:18
  • Hola Javier,

    casi lo tengo. Lo que estoy intentando es leer una báscula por el puerto comm. Según el manual que tengo la traza que devuelve es así:

    <STX><SOH><ST>PPPPPPPP<CR><LF><ETX>

    El caso es que sólo puedo leer los dos último dígitos del peso. He probado con un replace para quitar el cr y el lf pero nada. También he probado con el right y left pero lo mismo. ¿Se te ocurre cómo lo puedo formatear?

    Saludos y gracias.

    viernes, 6 de septiembre de 2013 14:11
  • ¿Puedes poner el código que estás usando?

    Saludos, Javier J

    lunes, 9 de septiembre de 2013 7:05
  • La dll tiene el siguiente código:

    Public Function PesoBascula(commPort As Integer) As Double

    Dim theBascula As MSComm
    Dim cadenas(3) As String
    Dim cadena As String
    Dim cadena_ok As String
    Dim strCheck As String
    Dim Peso As String
    Dim i As Long
    Dim t0 As Single
    Dim dummy As Integer
    Dim ini As Integer
    Dim fin As Integer
    Dim txtError As String

    Set theBascula = New MSComm
    theBascula.commPort = commPort
    theBascula.Handshaking = 0
    theBascula.RThreshold = 1
    theBascula.RTSEnable = True
    theBascula.Settings = "9600,n,8,1"
    theBascula.SThreshold = 1
    On Error GoTo FalloAbrirPuerto
    theBascula.PortOpen = True
    theBascula.InputLen = 0


        'Parametrizamos el objeto Conexion a puerto Comm
        If theBascula.PortOpen = False Then theBascula.PortOpen = True
        theBascula.InputLen = 0
        i = 0
        

         Do While PesoBascula = 0 And i < 2000
           i = i + 1
           DoEvents
           theBascula.Output = "$"

           cadena = (theBascula.Input)
           cadena_ok = cadena

    '       cadena_ok = Right(cadena, 8)
    '       cadena_ok = Left(cadena_ok, 6)
           If Len(cadena_ok) > 0 Then
             On Error Resume Next
             PesoBascula = CDbl(cadena_ok)
           End If
         Loop
           
        'Cerramos el puerto de comunicaciones
        theBascula.PortOpen = False


        If PesoBascula <= 0 Then PesoBascula = -2

        Set theBascula = Nothing
        
    Exit Function

    FalloAbrirPuerto:
      PesoBascula = -1
      Exit Function
     
    End Function

    ============

    y el exe:

    Private Sub Command1_Click()

    Dim objbascula As Object
    Dim commPort As Double
    Dim Peso As Double

    Set objbascula = CreateObject("Bascula.class1")
    Peso = objbascula.PesoBascula(4)
    MsgBox ("peso : " & Peso)
    End Sub

    =========

    Muchas gracias.



    • Editado droig lunes, 9 de septiembre de 2013 15:33
    lunes, 9 de septiembre de 2013 15:31
  • Quita la linea theBascula.InputLen = 0 y pone este código para ver que te manda la báscula:

    If Len(cadena_ok) > 0 Then

         ' Quita las dos lineas de momento
          '   On Error Resume Next
          '   PesoBascula = CDbl(cadena_ok)

    msgbox PesoBascula
    End If


    Saludos, Javier J

    • Marcado como respuesta droig viernes, 20 de septiembre de 2013 10:41
    lunes, 9 de septiembre de 2013 15:43
  • Hola Javier,

    perdona la demora en responder.

    Poniendo un msbox, si el peso de la báscula es 15880 me sale lo siguiente:

    A 15880

    A 15880

    A 15880

    ...

    Así varias líneas y, no lo tengo metido dentro de ningún bucle ni nada parecido.....

    miércoles, 11 de septiembre de 2013 15:50
  • Entonces haz que te tome el peso desde el 2º caracter.

    Saludos, Javier J

    miércoles, 11 de septiembre de 2013 16:25
  • Javier,

    perdona por no contestar a tiempo. Ya lo tengo solucionado en un wxp. Muchas gracias.

    Ahora estoy reproduciéndolo en un w7. Si lo depuro lo hace bien pero cuando compilo y genero la dll algo debo hacer mal al registrarla.

    ¿Dónde debo registrarla en la carpeta syswow64 o en la carpeta que me genera al desempaquetar el proyecto en C:\Program Files (x86)\Bascula?

    Saludos.

    viernes, 20 de septiembre de 2013 10:41
  • Regístrala en la carpeta de la aplicación.

    Saludos, Javier J

    viernes, 20 de septiembre de 2013 10:47
  • En el paquete me mete los siguiente archivos:

    Bascula.dll C:\temp\bascula
    MSCOMES.DLL c:\windows\syswow64
    MSCOMM32.OCX c:\windows\syswow64
    VB6ES.DLL c:\windows\system32

    Yo sólo estoy registrando la bascula.dll en la ruta que se instala que es la  C:\Program Files (x86)\Bascula

    ¿Debería registrar las otras dll?....

    viernes, 20 de septiembre de 2013 11:02
  • Utiliza MSCOMM32.OCX


    Saludos, Javier J

    viernes, 20 de septiembre de 2013 11:23
  • Perdona no entiendo.

    ¿a qué te refieres que utilice esa OCX?..

    viernes, 20 de septiembre de 2013 11:32
  • ¿no te deja ejecutar? ¿Que error te da?

    Saludos, Javier J

    viernes, 20 de septiembre de 2013 11:59
  • No me da ningún error. Lo que sucede que el resultado no es el esperado.

    Como decía en xp ya recojo el pero bien. La cadena que me devuelve la báscula es, por ejemplo, "A  35670", es decir, el peso es 35670. Como bien me corregiste en el código con quitar unas líneas y hacer un right(peso, 8) lo solucioné. Creé la dll y empaqueté en programita y en el xp me devuelve el peso correctamente.

    En windows 7, sin embargo me sigue devolviendo sólo los dos últimos carácteres de la cadena, por ejemplo, en este caso un "70". Eso una vez genero la dll bascula.dll, empaqueto todo y lo instalo. Una vez hecho esto registro la dll y pruebo el programa. 

    Sin embargo, si depuro la dll en vb6 me devuelve el peso correctamente. Por eso preguntaba dónde debía poner la dll si dejarla en la carpeta de instalación o en syswow64.... y registrarla.

    viernes, 20 de septiembre de 2013 13:10
  • Puedes crearte un fichero en el que guardes las lecturas que te devuelve la báscula.

    Esta función te va a crear un fichero Lecturas.txt en la ruta de la aplicación:

    Private Sub EscribeLinea (Texto as String)
    
    Const fic As String = "My.Application.Info.DirectoryPath\Lecturas.txt"
    
    Dim sw As New System.IO.StreamWriter(fic, True)
    sw.WriteLine(Texto)
    sw.Close()
    
    End SUb

    Haz una llamada a esta función en

    If Len(cadena_ok) > 0 Then
          On Error Resume Next

          EscribeLinea (cadena_ok)
          PesoBascula = CDbl(cadena_ok)
    End If


    Saludos, Javier J

    lunes, 23 de septiembre de 2013 7:17
  • Hola Javier,

    disculpa que no te haya contestado. Todavía no he podido probarlo.

    Muchas gracias.

    martes, 15 de octubre de 2013 7:38
  • Hola Javier,

    he probado la función que me dices y en Lecturas.txt, la primera vez que lo probé parecía que recogía el peso correctamente "1160" pero, a la que voy a hacer un par de cambios más ya no me ha vuelto a capturar el peos correctamente. Por lo que sea simpre me recoge sólo los dos últimos dígitos "60".

    He probado a reiniciar y a poner en el código la línea "theBascula.InBufferCount = 0" que en teoría me reinicia el buffer del mscomm pero no ha funcionado.

    Es como si se quedase en el buffer el mismo valor siempre y no hubiese manera de borrar.

    ¿Cualquier sugerencia será bien recibida?

    Gracias, saludos.

    viernes, 18 de octubre de 2013 14:28