¿Medio of topick?: Tipos de datos para dll's

Tus experiencias con la informática, o fuera de la informática
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: ¿Medio of topick?: Tipos de datos para dll's

Mensaje por Jonny »

Hola

Pues aún no lo he pasado a VB.net, como soy un cabezota he seguido probando con el VB 6...
Lo que está claro, es que es culpa del VB 6. Sin complicarle mucho la vida con los strings, sigue petando. Por ejemplo, pasándole una cadena como unicode directamente que es como lo medio tolera, si intento hacer algo con el parámetro que recibe como mostrarlo en un MsgBox(), comparar con un If... etc, peta. Oséa, que ya no solo peta al recibir o devolver cadenas si no se hace de una forma muy concreta (que eso se medio soluciona pasándo la cadena como unicode y recogiéndola también como unicode (devuelve una cadena vacía). Sinó, que al manipular los strings sigue petando.

Espero que solo ocurra con las dll, porque sinó Vaya lenguaje más.. jeje.

Por cierto, esto no lo he probado, porque no se como hacerlo con AutoIt.

¿Como se usaría una Dll ActiveX con AutoIt (si esque se puede)?
Lo digo, porque a lo mejor, peta por el linker modificado que se supone hay que hacer, para poder crear dlls normales, pero quizá las ActiveX funcionen bien...

Esque, es muy raro que al intentar hacer algo como:

Código: Seleccionar todo

If Param1="Hola mundo" Then
Msgbox("El parámetro es correcto")
End If
Pete el script de AutoIt que llama a la dll... Es rarísimo, porque no da tiempo a ver qué devuelve la dll, ni nada.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: ¿Medio of topick?: Tipos de datos para dll's

Mensaje por Ximorro »

A mí no me parece nada raro que pete, ya te digo que sospecho que el problema está en la representación interna de String en VB. El error es el típico del programa metiéndose en zonas de memoria que no le corresponden, algo muy común si no tiene claro dónde termina la cadena.

Un ActiveX no va a solucionar nada porque hará exactamente lo mismo al general la DLL, un ActiveX es como lo otro pero muuuucho más complicado (con componentes visuales y toda la pesca), así que no veo por qué iba a hacerlo mejor...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: ¿Medio of topick?: Tipos de datos para dll's

Mensaje por Jonny »

Hola

quizá tenga su lógica que si hay algún error en la dll (que está claro que es ahí donde está el problema) pete el AutoIt, pero ¿no debería devolver algún valor en @Error por ejemplo la función DllCall?. Yo lo veo más normal que no un cuelgue repentino.

Lo de la dll ActiveX, era por curiosidad, como decía una remota posibilidad, podría ser que todo viniera por la modificación del linker... Olvidé decir, que quizá funcionara bien una dll ActiveX, pero con el linker original del VB.

Pues es cierto lo que dices de los accesos incorrectos a memoria. De ser así ¿alguna forma de solucionarlo aún siendo un poco chapucera?. Por aquello de descartar cosas...

Por cierto:
Buscando como llamar a la dll desde VB6, para probar de todo desde el VB ya que queda claro que desde AutoIt peta, he visto esta página:
http://www.elguille.info/vb/avanzado/cr ... licado.htm
en la que dice:
' Las cadenas de VB6 son Unicode y al usarla desde una DLL
' se hace un follón... así que debemos quitarles los Chr$(0)
' que tenga en medio
Tiene pinta de ir por lo que decías del acceso incorrecto a memoria por no saber cuando acaba una cadena ¿no?

Almenos, en C/C++, este carácter si no recuerdo mal indicaba un fin de cadena.
Aunque, veo que en el código de esa página quitan el chr(0) después de llamar a la función de la dll (según explican para que obtengamos toda la cadena y no solo el primer carácter de esta).

y confirmado :
las dll que manejen strings hechas en VB6, no funcionan de ninguna manera. He probado a llamar a una dll que intente manipular una cadena desde un ejecutable hecho con VB6 y ocurre exactamente lo mismo. Peta igual que el AutoIt (como era de esperar). Supongo que habré hecho bien el código, que es este:

Código: Seleccionar todo

Option Explicit

Private Declare Function Saludo Lib "Prueba.dll" (ByVal Message As String) As String

Private Sub Main()
Dim CallFunc As String
Dim Message As String
Message = "Hola mundo"
CallFunc = Saludo(Message)
CallFunc = MTrim(CallFunc)
MsgBox CallFunc
End Sub

Private Function MTrim(ByVal s As String) As String
    Dim i As Long
    Dim res As String
    
    For i = 1 To Len(s)
        If Mid$(s, i, 1) <> Chr$(0) Then
            res = res & Mid$(s, i, 1)
        End If
    Next
    
    MTrim = res
End Function
Así, que me parece que no hay más que probar en VB6...

Salu2!
Responder