FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ayuda con funciones de una DLL
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
Ayuda con funciones de una DLL
Posted: Thu May 19, 2011 05:11 PM
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 (fw): Select all Collapse
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 :-)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con funciones de una DLL
Posted: Thu May 19, 2011 05:52 PM
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 (fw): Select all Collapse
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
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
Re: Ayuda con funciones de una DLL
Posted: Thu May 19, 2011 07:35 PM
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 (fw): Select all Collapse
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 (fw): Select all Collapse
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 :-)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con funciones de una DLL
Posted: Thu May 19, 2011 10:57 PM
Jos茅,

La funci贸n espera las cadenas en unicode (widechar):
Code (fw): Select all Collapse
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
Posts: 282
Joined: Mon Oct 10, 2005 08:55 AM
Re: Ayuda con funciones de una DLL
Posted: Fri May 20, 2011 09:54 AM

Antonio era eso, no sabia que exist铆a esa funci贸n.

una vez mas muuuuchas gracias :shock: :shock: :shock:

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Ayuda con funciones de una DLL
Posted: Fri May 20, 2011 01:19 PM

Bien! :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion