Funciones en .dll

Funciones en .dll

Postby FranciscoA » Fri Jul 05, 2013 12:56 am

Amigos del foro.
Estoy integrando una .dll autocontenida, con algunas funciones propias. Hasta el momento he logrado hacer pruebas satisfactorias gracias a los ejemplos tanto en \samples, como aquí en el foro.
Hasta el momento todo iba bien, hasta que me atoré en una funcioncita que recibe como parámetro una fecha DATE y devuelve otra fecha DATE.
Solicito a los conocedores de C, algún ejemplo para poder solventar esto.
Aquí está el código que estoy probando, y no logro que me devuelva la fecha (DATE). Me devuelve un número.

Code: Select all  Expand view
#include "FiveWin.ch"

static hDLL

function Main()
local hItem4 := ItemNew( Date() )

   hDLL = LoadLibrary( "fapdll.dll" )

   MsgInfo ( FirstMonthDay("DIA1MES", hItem4), "1er dia del mes" )
   ItemRelease( hItem4 )

   FreeLibrary( hDLL )

return nil

DLL FUNCTION FirstMonthDay( cProc AS LPSTR, pItem1 AS LONG ) AS LONG PASCAL LIB hDLL

#pragma BEGINDUMP

#include <hbapi.h>
#include <hbapiitm.h>

HB_FUNC( ITEMNEW )
{
   hb_retnl( ( unsigned long ) hb_itemNew( hb_param( 1, HB_IT_ANY ) ) );
}

HB_FUNC( ITEMRELEASE )
{
   hb_retl( hb_itemRelease( ( PHB_ITEM ) hb_parnl( 1 ) ) );
}

#pragma ENDDUMP    

 



Aquí, dentro de la .dll:
Code: Select all  Expand view
//-----------------------
Function Dia1Mes(dFecha)
Return ctod( "01/"+strZero(month(dFecha),2)+"/"+str(year(dFecha),4) )

#pragma BEGINDUMP

#include <windows.h>
#include <hbvm.h>
#include <hbapiitm.h>


LONG __stdcall __export FirstMonthDay( char * cProcName, PHB_ITEM pParam1 )
{
   return hb_itemGetNL( hb_itemDoC( cProcName, 1, pParam1 ) ) ;
}  

#pragma ENDDUMP
 


Muchas gracias, de antemano.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Funciones en .dll

Postby Antonio Linares » Fri Jul 05, 2013 3:54 am

Francisco,

Nunca me agradó el itemAPI que CA introdujo en Clipper y que luego Harbour heredó, dicho esto... :-)

tu función en C FirstMonthDay() está devolviendo un LONG (un número de 32 bits) y además estas recogiendo como número la fecha que le das:

return hb_itemGetNL( hb_itemDoC( cProcName, 1, pParam1 ) ) ;

puesto que recibes una fecha, primero debes decidir en que formato la vas a usar. Uno sencillo es "AAAAMMDD", luego esa línea quedaria asi:

return hb_itemGetDS( hb_itemDoC( cProcName, 1, pParam1 ) ) ;

pero entonces tu función FirstMonthDay() no devolverá un LONG sino un char * (texto):

Code: Select all  Expand view
char * __stdcall __export FirstMonthDay( char * cProcName, PHB_ITEM pParam1 )
{
   return hb_itemGetDS( hb_itemDoC( cProcName, 1, pParam1 ) ) ;
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42080
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Funciones en .dll

Postby FranciscoA » Fri Jul 05, 2013 4:58 am

Antonio,
Te agradezco mucho. Funciona!!!. Quedó así:

Code: Select all  Expand view
DLL FUNCTION FirstMonthDay( cProc AS LPSTR, pItem1 AS LONG ) AS LPSTR PASCAL LIB hDLL

Code: Select all  Expand view

char * __stdcall __export FirstMonthDay( char * cProcName, PHB_ITEM pParam1 )
{
   return hb_itemGetDS( hb_itemDoC( cProcName, 1, pParam1 ) ,"AAAAMMDD" ) ;
}
 

Gracias nuevamente, y saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 52 guests