Usa:
DLL FUNCTION ...
en vez de
DLL32 FUNCTION ...
Usa:
DLL FUNCTION ...
en vez de
DLL32 FUNCTION ...
También prueba a quitar la claúsula PASCAL aqui:
... AS LONG PASCAL FROM "DLOpen" lib "devLink.dll"
a ver si así aparece el MsgInfo()
Hola Antonio.
No genera ningún archivo de log en el directorio.
Con las demás indicaciones no he conseguido tampoco obtener el msginfo().
No se si puedo dar mas información acerca del proyecto.
Si encuentro la forma de hacerlo funcionar por mi cuenta , lo comento.
Muchas gracias.
Un saludo
void CALLBACK CallBackFunction( LONG pbxh, DWORD comms_state, DWORD parm1 )
{
MessageBox( 0, "ok", "ok", 0 );
}void CALLBACK CallBackFunction( LONG pbxh, DWORD comms_state, DWORD parm1 )
{
MessageBox( 0, "ok", "ok", 0 );
}
HB_FUNC( CALLBACKFUNCTION )
{
LONG pbx ;
DWORD cmms ;
DWORD par ;
CallBackFunction(pbx,cmms,par );
}#ifndef _DEVLINK_H_
#define _DEVLINK_H_
typedef char TEXT;
#define DEVLINK_SUCCESS 0
#define DEVLINK_UNSPECIFIEDFAIL 1
#define DEVLINK_LICENCENOTFOUND 2
#define DEVLINK_COMMS_OPERATIONAL 0
#define DEVLINK_COMMS_NORESPONSE 1
#define DEVLINK_COMMS_REJECTED 2
#define DEVLINK_COMMS_MISSEDPACKETS 3
#ifdef __cplusplus
extern "C"
{
#endif
typedef void (CALLBACK * DLCALLLOGEVENT)(
DWORD pbxh,
TEXT * info
);
typedef void (CALLBACK * DLCOMMSEVENT)(
DWORD pbxh,
DWORD comms_state,
DWORD parm1
);
LONG PASCAL DLOpen( DWORD pbxh
, TEXT * pbx_address
, TEXT * pbx_password
, TEXT * reserved1
, TEXT * reserved2
, DLCOMMSEVENT cb
);
LONG PASCAL DLClose( DWORD pbxh );
LONG PASCAL DLRegisterType2CallDeltas( DWORD pbxh, DLCALLLOGEVENT cb );
#ifdef __cplusplus
};
#endif
#endif // _DEVLINK_H_Cuando el comando DLL FUNCTION ... no consigue nuestro objetivo entonces hay que programar la función enteramente en lenguaje C:
Añade esto a tu PRG y elimina la declaración DLL FUNCTION ...
HB_FUNC( DLOPEN )
{
DLOpen( hb_parnl( 1 ), hb_parc( 2 ), hb_parc( 3 ), hb_parc( 4 ), hb_parc( 5 ), ( DLCOMMSEVENT ) hb_parnl( 6 ) );
}
Para poder enlazar el EXE tienes que crear una librería de importación LIB a partir de la DLL usando implib.exe
Ya tengo la lib extraida de la dll con implib, esta incluida en el proyecto.
Me da estos errores ahora del .h y en la llamada a la funcion.
Error E2293 \trunk\Include\devlink.h 29: ) expected
Error E2293 \trunk\Include\devlink.h 34: ) expected
Error E2141 \trunk\Include\devlink.h 40: Declaration syntax error
Error E2141 \trunk\Include\devlink.h 47: Declaration syntax error
Error E2141 \trunk\Include\devlink.h 49: Declaration syntax error
Error E2451 ORDREP.prg 163: Undefined symbol 'DLCOMMSEVENT' in function HB_FUN_DLOPEN
Error E2121 ORDREP.prg 163: Function call missing ) in function HB_FUN_DLOPEN
Aqui estoy perdido, he puesto el codigo tal y como decias.
El devlink.h no debe estar con la sitaxis correcta. Desconozco como es.
Gracias por tu ayuda.
Un saludo
Buenos días.
Funciona, compila y arranca, ¿cual es el siguiente paso?
Entiendo que ahora necesitaremos capturar los datos del callback.
Muchas gracias por tu ayuda.
Un saludo
Implementa el callback como yo te indiqué:
viewtopic.php?p=214706#p214706
Y comprueba si aparece el MessageBox()
function main()
DLOpen(1,'255.255.255.255','PWD',nil,nil, CallBackFunction() )
return nil
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include "devlink.h"
void CallBackFunction( LONG pbxh, DWORD comms_state, DWORD parm1 )
{
MessageBox( 0, "ok", "ok", 0 );
}
HB_FUNC( CALLBACKFUNCTION )
{
hb_retnl( ( LONG ) CallBackFunction );
}
HB_FUNC( DLOPEN )
{
DLOpen( hb_parnl( 1 ), ( char * ) hb_parc( 2 ), ( char * ) hb_parc( 3 ), ( char * ) hb_parc( 4 ), ( char * ) hb_parc( 5 ), ( DLCOMMSEVENT ) CallBackFunction ) ;
}
HB_FUNC( DLCLOSE )
{
DLClose( hb_parnl( 1 ) ) ;
}
#pragma ENDDUMPfunction main()
MsgInfo( CallBackFunction() ) // La llamada devuelve ->4200388 , si comento el messagebox , la llamada a este msgInfo me devuelve el mismo valor -> 4200388
MsgInfo( DLOpen(1,'255.255.255.255','PWD',nil,nil, CallBackFunction() ) // la llamada a la funcion devuelve nil
return nil
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>
#include "devlink.h"
void CallBackFunction( LONG pbxh, DWORD comms_state, DWORD parm1 )
{
MessageBox( 0, "ok", "ok", 0 );
}
HB_FUNC( CALLBACKFUNCTION )
{
hb_retnl( ( LONG ) CallBackFunction );
}
HB_FUNC( DLOPEN )
{
DLOpen( hb_parnl( 1 ), ( char * ) hb_parc( 2 ), ( char * ) hb_parc( 3 ), ( char * ) hb_parc( 4 ), ( char * ) hb_parc( 5 ), ( DLCOMMSEVENT ) CallBackFunction ) ;
}
HB_FUNC( DLCLOSE )
{
DLClose( hb_parnl( 1 ) ) ;
}
#pragma ENDDUMPHB_FUNC( CALLBACKFUNCTION )
{
LONG pbxh;
DWORD comms_state;
DWORD parm1;
CallBackFunction( pbxh, comms_state, parm1 );
}Falta añadir CALLBACK aqui:
void CALLBACK CallBackFunction( LONG pbxh, DWORD comms_state, DWORD parm1 )
{
MessageBox( 0, "ok", "ok", 0 );
}
Buenos días.
Discúlpame Antonio, no hay manera.
Si pudiera encontrar un ejemplo completo a lo mejor veo algo que estoy haciendo mal.
Muchas gracias por tu ayuda.
Un saludo.
Function main()
DLOpen(1,cIp , cPass ,nil,nil, CallBackFunction() )
return nil
DLL function DLOpen( pbxh AS DWORD , ;
pbx_address AS LPSTR,;
pbx_password AS LPSTR,;
reserved1 AS LPSTR,;
reserved2 AS LPSTR,;
cb AS LONG ) AS LONG FROM "DLOpen" lib "devLink.dll"
#pragma BEGINDUMP
#include <Windows.h>
#include <hbapi.h>
void CallBackFunction( LONG pbxh, DWORD comms_state, DWORD parm1 )
{
MessageBox( 0, "ok", "ok", 0 );
}
HB_FUNC( CALLBACKFUNCTION )
{
hb_retnl( ( LONG ) CallBackFunction );
}
#pragma ENDDUMPfunction CommsEvent( nPbxh, nComms_state, nParm1 )
MsgInfo( nPbhx )
MsgInfo( nComms_state )
MsgInfo( nParm1 )
return nil
#pragma BEGINDUMP
#include <Windows.h>
#include <hbapi.h>
#include <hbvm.h>
void CallBackFunction( LONG pbxh, DWORD comms_state, DWORD parm1 )
{
hb_vmPushSymbol( hb_dynsymGetSymbol( "COMMSEVENT" ) );
hb_vmPushNil();
hb_vmPushLong( pbhx );
hb_vmPushLong( comms_state );
hb_vmPushLong( parm1 );
hb_vmFunction( 3 ); // 3 parámetros
}
HB_FUNC( CALLBACKFUNCTION )
{
hb_retnl( ( LONG ) CallBackFunction );
}
#pragma ENDDUMP