Ayuda con funciones de una DLL

Post Reply
User avatar
José Vicente Beltrán
Posts: 282
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Ayuda con funciones de una DLL

Post by José Vicente Beltrán »

Hola Foro
Tengo el siguiente código que pretende conectar a un servidor externo para sincronizar la hora y fecha con el ordenador, pero por alguna razón la función ExecuteSynchronization() siempre devuelve una cadena vacia. Teniendo en cuenta que las claves están comprobadas y junto con las funciones correspondientes funcionan correctamente en otros lenguajes, sospecho que la funcion de Login no está trabajando correctamente.
No hay errores de compilación ni mensajes de error en ejecución.

¿Alguien que haya usado estas funciones antes sabe que estoy haciendo mal?

Code: Select all | Expand

FUNCTION main()
local usuario := 'usuario'
local clave   := 'clave'
local nserie  := 'DEMO'
local Servidor:= 'url.com'

nLib := LoadLibrary("SEMAPI.DLL")  // => variable estatica

if SetLoginParamsAPI(usuario, clave, nserie, Servidor, 0) > 0  // inicialización => siempre devuelve 1

    // Ejemplo de sincronización
    SetTimeZoneSynchronization('Europe/Madrid') // => no devuelve nada

    if ExecuteSynchronization() = 'OK' // => MAL porque siempre devuelve una cadena vacia
        MsgInfo('Fecha y hora del servidor (AAAAMMDDhhmmss): ' + GetDateTime())
    endif

FreeLibrary(nLib)

return nil

****************************************************************************************
**declaración de funciones de la dll**********************************************
****************************************************************************************

DLL FUNCTION SetLoginParamsAPI( @AUserName AS LPSTR,;
                                  @APassword AS LPSTR,;
                                  @ALicense AS LPSTR,;
                                  @AHost AS LPSTR,;
                                  Aport AS LONG ) AS LONG PASCAL FROM "SetLoginParamsAPI" LIB nLib

DLL FUNCTION SetTimeZoneSynchronization( ATimeZone AS LPSTR ) AS LONG PASCAL FROM "SetTimeZoneSynchronization" LIB nLib

DLL FUNCTION ExecuteSynchronization() AS LPSTR PASCAL FROM "ExecuteSynchronization" LIB nLib

DLL FUNCTION GetDateTime() AS LPSTR PASCAL FROM "GetDateTime" LIB nLib
 


gracias por vuestra ayuda :shock:
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Re: Ayuda con funciones de una DLL

Post by Antonio Linares »

Jose,

Prueba a quitar las @ de tu declaracion, puesto que los punteros a cadenas normalmente no necesitan ser pasados por referencia. De todas formas si copias aqui la declaracion de tu funcion en lenguage C (u otro similar) ayudara a comprobar que la estes declarando correctamente:

Code: Select all | Expand

DLL FUNCTION SetLoginParamsAPI( AUserName AS LPSTR,;
                                  APassword AS LPSTR,;
                                  ALicense AS LPSTR,;
                                  AHost AS LPSTR,;
                                  Aport AS LONG ) AS LONG PASCAL FROM "SetLoginParamsAPI" LIB nLib
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
José Vicente Beltrán
Posts: 282
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Re: Ayuda con funciones de una DLL

Post by José Vicente Beltrán »

Gracias por responder, Antonio
He quitado las @ y no hay ninguna diferencia apreciable en el resultado.
No dispongo del codigo en C, tan solo de la declaración en delphi o en visual foxpro

Este es el código en delphi

Code: Select all | Expand


const
  SEM_SERVIDOR = 'url.com';
  SEM_PORT = 0;

type
    license_number: TEdit;
    license_username: TEdit;
    license_password: TEdit;
  end;

function SetLoginParamsAPI(AUserName, APassword, ALicense, AHost: PWideChar; APort: Integer): Boolean; stdcall; external 'semapi.dll';

function SetTimeZoneSynchronization(ATimeZone: PChar): Boolean; stdcall; external 'semapi.dll';

function ExecuteSynchronization: PChar; stdcall; external 'semapi.dll';

function GetDateTime: PChar; stdcall; external 'semapi.dll';
 


Este es el equivalente visual foxpro

Code: Select all | Expand


usuario = StrConv(StrConv('usuario_licencia' + Chr(0), 1), 5)
clave = StrConv(StrConv('clave_licencia' + Chr(0), 1), 5)
nserie = StrConv(StrConv('licencia' + Chr(0), 1), 5)
url = StrConv(StrConv('url.com' + Chr(0), 1), 5)

DECLARE Long SetLoginParamsAPI IN 'D:\Desarrollo\Proyectos\semApi\SEM Samples\Visual Foxpro\semapi.dll';
String @AUserName, String @APassword, String @ALicense, String @AHost, Long APort

DECLARE Long SetTimeZoneSynchronization IN 'semapi.dll' String ATimeZone

DECLARE String ExecuteSynchronization IN 'semapi.dll'

DECLARE String GetDateTime IN 'semapi.dll'
 


ojalá sirva :shock:
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Re: Ayuda con funciones de una DLL

Post by Antonio Linares »

José,

La función espera las cadenas en unicode (widechar):

Code: Select all | Expand

function SetLoginParamsAPI(AUserName, APassword, ALicense, AHost: PWideChar; APort: Integer): Boolean; stdcall; external 'semapi.dll';

PWideChar = puntero a wide chars

Prueba a convertir cada valor con AnsiToWide( <cValor> ) antes de pasarlos a la función. Tambien te sirve la función hb_mbtowc( cValor ) que es equivalente.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
José Vicente Beltrán
Posts: 282
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Re: Ayuda con funciones de una DLL

Post by José Vicente Beltrán »

Antonio era eso, no sabia que existía esa función.

una vez mas muuuuchas gracias :shock: :shock: :shock:
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Re: Ayuda con funciones de una DLL

Post by Antonio Linares »

Bien! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply