Dll Exportar

Consultas sobre el lenguaje Pauscal

Dll Exportar

Notapor PowerDeath » Vie Oct 17, 2014 8:34 pm

¿Alguien ah probado exitosa mente las librerías DLL generadas en Pauscal?
Siempre que intento utilizarlas en otros lenguajes, se produce un error al devolver datos.
Probado en Windows 7 Ultimate Sp1 - Lenguajes: AutoitScript & Visual Basic 6.0.

¿Alguna idea de como puedo resolverlo?
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am

Sponsor


Re: Dll Exportar

Notapor ErikH » Dom Oct 19, 2014 1:56 pm

No he tenido problemas para ejecutar el siguente código. Excepto que se me olvida el exportar de la función. :lol:

Código fuente para la biblioteca:

bibliotecaprueba.dll
Código: Seleccionar todo
Importar "Pauscal.prp"

Proc MensajeT() Exportar
Mensaje("sasasasasa")
FinProc

Proc ResultadoEntero():Entero Exportar
Resultado = 1337
FinProc


Código fuente para ejecutar:
Pauscal:
Código: Seleccionar todo
Importar "Pauscal.prp"

Proc MensajeT(), "bibliotecaprueba"
Proc ResultadoEntero():Entero, "bibliotecaprueba"

MensajeT()
Mensaje(EntCad(ResultadoEntero()))

Fin


csharp:
Código: Seleccionar todo
using System;
using System.Runtime.InteropServices;

namespace runfunc
{
   class Program
   {
         [DllImport(@"C:\ruta\bibliotecaprueba.dll")]
         static extern void MensajeT();
         [DllImport(@"C:\ruta\bibliotecaprueba.dll")]
         static extern Int32 ResultadoEntero();
         
         public static void Main(string[] args)
      {
         Console.WriteLine("Hola mundo!");
         
         // TODO: Implement Functionality Here
         MensajeT();
         
         Console.WriteLine(ResultadoEntero().ToString());
         
         Console.Write("Press any key to continue . . . ");
         Console.ReadKey(true);
      }
   }
}


Autoit:
Código: Seleccionar todo
#include <MsgBoxConstants.au3>

DllCall("bibliotecaprueba","NONE","MensajeT")

Local $resultadoentero = DllCall("bibliotecaprueba","INT","ResultadoEntero")
MsgBox($MB_SYSTEMMODAL, Default, "ResultadoEntero(): " & $resultadoentero[0])
ImagenEntrá a la wiki en OpenShift
Colofox!!!!
ErikH
 
Mensajes: 151
Registrado: Jue Nov 29, 2007 11:24 pm
Ubicación: Algún lugar de México

Re: Dll Exportar

Notapor PowerDeath » Lun Oct 20, 2014 12:23 am

Jajaj esta bien, estaba probando llamar la siguiente función en otros lenguajes, No me fije que hay que establecer los parámetros de referencia en Pauscal en modo de referencia al llamarlos ... Por eso se generaba un error.

Código: Seleccionar todo
Proc CadXor(Referencia Cadena1:Cadena):Cadena Exportar
Var Kod,X2:Cadena
Var X3:Entero
Contar X3 = 1 a CadLong(Cadena1)
X2 = ParteCad(Cadena1,X3,1)
Kod = Kod + Carac(ASCII(X2) Xor 255)
Seguir
Devolver Kod
FinProc


En Visual Basic 6.0 el ByRef tiene que ser establecido o genera error.
Código: Seleccionar todo
Public Declare Function CadXor Lib "Cadena" (ByRef Str As String) As String


Pero en autoit me genera un error aunque le establezca el parámetro 1 como referencia.
Código: Seleccionar todo
#include <MsgBoxConstants.au3>

Local $resultadoentero = DllCall("Cadena","STR","CadXor","STR*","Hola Mundo!")
MsgBox($MB_SYSTEMMODAL, Default, "ResultadoEntero(): " & $resultadoentero[0])
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am

Re: Dll Exportar

Notapor ErikH » Lun Oct 20, 2014 4:10 am

No se como hacer que funcione la variable de cadena por referencia :black_eye: , solamente cuando mando un valor tipo str desde autoit, pauscal lo recibe como un entero y luego copia el valor con CadenadePtrCad(). Y el resultado lo envía como un puntero de cadena.

Biblioteca cadenaq.dll
Código: Seleccionar todo
Importar "Pauscal.prp"

Proc CadXor(Referencia Cadena1:Cadena):Cadena Exportar
Var Kod,X2:Cadena
Var X3:Entero
Contar X3 = 1 a CadLong(Cadena1)
X2 = ParteCad(Cadena1,X3,1)
Kod = Kod + Carac(ASCII(X2) Xor 255)
Seguir
Devolver Kod
FinProc

Proc ResultadoPtrCadena():Entero Exportar
Resultado = CadPtr("Hola desde Pauscal!")
FinProc

Proc MensajeDeAutoitPtr(Cadena1:Entero) Exportar
Mensaje("DENTRO DE PAUSCAL:" + crlf +CadenaDePtrCad(Cadena1))
FinProc


Proc maspauscal(Referencia Cadena1:Cadena):Entero Exportar
Var Res:Cadena
Res = Cadena1 + "+pauscal"
Resultado = CadPtr(Res)
Finproc

Proc maspauscalPtr(Cadena1:Entero):Entero Exportar
Var Res:Cadena
Res = CadenaDePtrCad(Cadena1) + "+pauscal"
Resultado = CadPtr(Res)
FinProc


Código Autoit:
Código: Seleccionar todo
#include <MsgBoxConstants.au3>

Local $tString = "Hola desde autoit"
DllCall("cadenaq", "none", "MensajeDeAutoitPtr", "str", $tString )

Local $resultadocadena = DllCall("cadenaq", "str", "ResultadoPtrCadena" )
MsgBox($MB_SYSTEMMODAL, Default, "ResultadoPtrCadena(): " & $resultadocadena[0])

Local $soloautoit = "Solo Autoit"
Local $soloAutoitMasPauscal = DllCall("cadenaq", "str", "maspauscalPtr", "str", $soloautoit )
MsgBox($MB_SYSTEMMODAL, Default, "maspauscal(): " & $soloAutoitMasPauscal[0])



Hasta donde comprendo maspauscal() y maspauscalPtr() deberían de ser funciones equivalentes, en el sentido de que podrías llamarlas desde autoit exactamente con los mismos argumentos. Pero no es así y no se porque.
De lo que si estoy seguro es que no vas a poder mandar un tipo Cadena de pauscal a Autoit, porque no creo que eso sea lo que espera cuando le dices que el valor que devuelve la función es de tipo str.
ImagenEntrá a la wiki en OpenShift
Colofox!!!!
ErikH
 
Mensajes: 151
Registrado: Jue Nov 29, 2007 11:24 pm
Ubicación: Algún lugar de México

Re: Dll Exportar

Notapor PowerDeath » Lun Oct 20, 2014 5:00 am

Básicamente hay que adaptar el código escrito en Pauscal para que sea compatible con Autoit.

Código: Seleccionar todo
Importar "Cadena.prp"
Proc CadXorA(Referencia Caden:Entero):Entero Exportar
Var Kod,X2:Cadena
Var X3:Entero
Var Cadena1:Cadena
Cadena1 = CadenaDePtrCad(Caden)
Contar X3 = 1 a CadLong(Cadena1)
X2 = ParteCad(Cadena1,X3,1)
Kod = Kod + Carac(ASCII(X2) Xor 255)
Seguir
Devolver CadPtr(Kod) ' Atajo a CadPtr ...
FinProc


Código: Seleccionar todo
#include <MsgBoxConstants.au3>

Local $tString = "Hola desde autoit"
$resultadocadena = DllCall("CAD", "str", "CadXorA", "str*", $tString )
;$resultadocadena = DllCall("CAD", "str", "CadXorA", "str*", $resultadocadena[0]) ; Re-Llamamos para obtener la cadena original.
MsgBox($MB_SYSTEMMODAL, Default, "ResultadoPtrCadena(): " & $resultadocadena[0])


¿Entonces podemos decir que el tipo de dato Entero de Pauscal es utilizable/Compatible con la mayoría de los tipos de datos de Autoit?
https://www.autoitscript.com/autoit3/do ... llCall.htm
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am


Volver a Dudas, Preguntas y Respuestas

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron