FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Wrapper a una DLL
Posts: 485
Joined: Fri Feb 09, 2007 10:34 AM
Wrapper a una DLL
Posted: Mon Mar 23, 2009 01:04 PM

Muy buenas, estoy intentado hacer un wrapper a las funciones de una DLL, mi problema es que no me funcionan importando las funciones directamente de la DLL, entonces creando el wrapper tengo un problema, ya tengo la .lib importada con implib de Borland C++, mi codigo es este:

pragma BEGINDUMP

HB_FUNC(OPENDEVICE)
{
long CardAddress;
long lReturn;

CardAddress = hb_parni(1);
lReturn = OpenDevice(CardAddress);
hb_retnl(lReturn);

}

pragma ENDDUMP

pero a la hora de compilar y linkar mi .prg me da el siguiente error:

CdiPLC.c:
Warning W8065 CdiPLC.prg 51: Call to function 'OpenDevice' with no prototype in function HB_FUN_OPENDEVICE
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_OpenDevice' referenced from Z:\SOFTWARE\FWH809\PROJECT\CDIPLC\FUE\CDIPLC.OBJ
- Aplicacion completamente construida.

¿ Sabeis por que puede ser? La funcion Opendevice esté en el .DLL

Un Saludo.

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Wrapper a una DLL
Posted: Tue Mar 24, 2009 09:22 AM
softruz wrote:Muy buenas, estoy intentado hacer un wrapper a las funciones de una DLL, mi problema es que no me funcionan importando las funciones directamente de la DLL, entonces creando el wrapper tengo un problema, ya tengo la .lib importada con implib de Borland C++, mi codigo es este:

#pragma BEGINDUMP
HB_FUNC(OPENDEVICE)
{
long CardAddress;
long lReturn;

CardAddress = hb_parni(1);
lReturn = OpenDevice(CardAddress);
hb_retnl(lReturn);
}
#pragma ENDDUMP

pero a la hora de compilar y linkar mi .prg me da el siguiente error:

CdiPLC.c:
Warning W8065 CdiPLC.prg 51: Call to function 'OpenDevice' with no prototype in function HB_FUN_OPENDEVICE
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_OpenDevice' referenced from Z:\SOFTWARE\FWH809\PROJECT\CDIPLC\FUE\CDIPLC.OBJ
- Aplicacion completamente construida.

¿ Sabeis por que puede ser? La funcion Opendevice esté en el .DLL

Un Saludo.


Prueba esto:

Code (fw): Select all Collapse
#pragma BEGINDUMP

LONG OpenDevice( INT CardAddress );

HB_FUNC(MIOPENDEVICE)
{
    int CardAddress;
    long lReturn;
    
    CardAddress = hb_parni(1);
    lReturn = OpenDevice(CardAddress);
    hb_retnl(lReturn);
}
#pragma ENDDUMP


Le he cambiado el nombre a TU función de OPENDEVICE a MIOPENDEVICE, y el tipo de variable de long a int.

No te fies, yo no se 'C'.

Un Saludo
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Wrapper a una DLL
Posted: Tue Mar 24, 2009 09:28 AM

Crea un fichero DEF a partir de la DLL:

impdef.exe TuDLL.DEF TuDLL.DLL

y copia aqui el contenido del fichero TuDLL.DEF. Es texto (ascii).

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 485
Joined: Fri Feb 09, 2007 10:34 AM
Re: Wrapper a una DLL
Posted: Tue Mar 24, 2009 09:44 AM

Antonio muy buenas este es mi .def:

LIBRARY K8055D.DLL

EXPORTS
ClearAllAnalog @13 ; ClearAllAnalog
ClearAllDigital @8 ; ClearAllDigital
ClearAnalogChannel @14 ; ClearAnalogChannel
ClearDigitalChannel @9 ; ClearDigitalChannel
CloseDevice @19 ; CloseDevice
OpenDevice @20 ; OpenDevice
OutputAllAnalog @15 ; OutputAllAnalog
OutputAnalogChannel @16 ; OutputAnalogChannel
ReadAllAnalog @17 ; ReadAllAnalog
ReadAllDigital @4 ; ReadAllDigital
ReadAnalogChannel @18 ; ReadAnalogChannel
ReadCounter @3 ; ReadCounter
ReadDigitalChannel @5 ; ReadDigitalChannel
ResetCounter @2 ; ResetCounter
SetAllAnalog @11 ; SetAllAnalog
SetAllDigital @6 ; SetAllDigital
SetAnalogChannel @12 ; SetAnalogChannel
SetCounterDebounceTime @1 ; SetCounterDebounceTime
SetDigitalChannel @7 ; SetDigitalChannel
WriteAllDigital @10 ; WriteAllDigital

Lo que quiero es solamente exportar estas funciones y utilizarlas en Visual Basic funcionan perfectamente pero aqui no lo consigo. ¿ Como lo podría hacer?

Un Saludo.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Wrapper a una DLL
Posted: Tue Mar 24, 2009 11:47 PM
Los simbolos no llevan subrayado delante, por lo que significaria que son de tipo "pascal".

Prueba asi:
Code (fw): Select all Collapse
#pragma BEGINDUMP

#include <hbapi.h>

LONG pascal OpenDevice( int CardAddress );

HB_FUNC(MIOPENDEVICE)
{
    int CardAddress;
    long lReturn;
    
    CardAddress = hb_parni(1);
    lReturn = OpenDevice(CardAddress);
    hb_retnl(lReturn);
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 485
Joined: Fri Feb 09, 2007 10:34 AM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 08:27 AM

Muy buenas Antonio, lo he probado pero no consigo realizarlo, me da el siguiente error al linkar

Error: Unresolved external 'OPENDEVICE' referenced from Z:\SOFTWARE\FWH809\PROJECT\CDIPLC\FUE\CDIPLC.OBJ

si alguien puede poner un ejemplo completo de hacer un wrapper de funciones de DLL y utilizarlas, se lo agradecería.

Un Saludo.

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 08:38 AM
softruz wrote:Muy buenas Antonio, lo he probado pero no consigo realizarlo, me da el siguiente error al linkar

Error: Unresolved external 'OPENDEVICE' referenced from Z:\SOFTWARE\FWH809\PROJECT\CDIPLC\FUE\CDIPLC.OBJ

si alguien puede poner un ejemplo completo de hacer un wrapper de funciones de DLL y utilizarlas, se lo agradecería.

Un Saludo.


Al final como ha quedado definida la función, MIOPENDEVICE u OPENDEVICE?

Un Saludo
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 485
Joined: Fri Feb 09, 2007 10:34 AM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 09:00 AM

Tal y como lo ha hecho antonio en el mensaje anterior, entonces llamo a miopendevice pero no me encuentra opendevice.
¿Que puedo hacer?
Un Saludo.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 09:01 AM

>
si alguien puede poner un ejemplo completo de hacer un wrapper de funciones de DLL y utilizarlas, se lo agradecería.
>

Lo estas haciendo bien, lo que ocurre que es extraño que esa función en la DLL no tenga un subrayado delante.

Por favor enviame la DLL por email, comprimida en un fichero ZIP y renombrada a ZOP para que gmail la acepte, gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 485
Joined: Fri Feb 09, 2007 10:34 AM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 09:13 AM

Muy buenas Antonio, ya te he enviado el email con la DLL y un pequeño ejemplo en VB.
Dime algo cuando lo veas.

Un Saludo.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 09:34 AM
Juan,

Asi funciona bien :-)
Habia que usar WINAPI en vez de pascal

Code (fw): Select all Collapse
function Main()

   MiOpenDevice()

return nil

#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>

LONG WINAPI OpenDevice( int CardAddress );

HB_FUNC( MIOPENDEVICE )
{
    int CardAddress;
    long lReturn;
    
    CardAddress = hb_parni(1);
    lReturn = OpenDevice(CardAddress);
    hb_retnl(lReturn);
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 485
Joined: Fri Feb 09, 2007 10:34 AM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 09:57 AM

Muchas gracias Antonio lo prueba y te comento.

Un Saludo.

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 06:32 PM
Antonio Linares wrote:Juan,

Asi funciona bien :-)
Habia que usar WINAPI en vez de pascal


Antonio,

Cómo sabes que debes usar WINAPI? Qué te lo indica?

Saludos
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 07:38 PM

Carlos,

> Cómo sabes que debes usar WINAPI? Qué te lo indica?

Que el simbolo que exporta la DLL usa mayusculas y minusculas y que no lleva subrayado delante.

Si llevase subrayado delante, entonces significa que es una funcion estandard en C.

Si fuese todo en mayusculas, y sin subrayado, significa que es pascal.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Wrapper a una DLL
Posted: Wed Mar 25, 2009 11:42 PM
Antonio Linares wrote:Carlos,

> Cómo sabes que debes usar WINAPI? Qué te lo indica?

Que el simbolo que exporta la DLL usa mayusculas y minusculas y que no lleva subrayado delante.

Si llevase subrayado delante, entonces significa que es una funcion estandard en C.

Si fuese todo en mayusculas, y sin subrayado, significa que es pascal.


Gracias Antonio,

Ampliare un mensaje para ignorantes que tengo en utilidades.

Un saludo
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home