Page 1 of 2

Wrapper a una DLL

PostPosted: Mon Mar 23, 2009 1:04 pm
by softruz
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.

Re: Wrapper a una DLL

PostPosted: Tue Mar 24, 2009 9:22 am
by FiveWiDi
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: Select all  Expand view

#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.

Re: Wrapper a una DLL

PostPosted: Tue Mar 24, 2009 9:28 am
by Antonio Linares
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).

Re: Wrapper a una DLL

PostPosted: Tue Mar 24, 2009 9:44 am
by softruz
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.

Re: Wrapper a una DLL

PostPosted: Tue Mar 24, 2009 11:47 pm
by Antonio Linares
Los simbolos no llevan subrayado delante, por lo que significaria que son de tipo "pascal".

Prueba asi:
Code: Select all  Expand view

#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
 

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 8:27 am
by softruz
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.

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 8:38 am
by FiveWiDi
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.

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 9:00 am
by softruz
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.

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 9:01 am
by Antonio Linares
>
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

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 9:13 am
by softruz
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.

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 9:34 am
by Antonio Linares
Juan,

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

Code: Select all  Expand view

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
 

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 9:57 am
by softruz
Muchas gracias Antonio lo prueba y te comento.

Un Saludo.

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 6:32 pm
by FiveWiDi
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.

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 7:38 pm
by Antonio Linares
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.

Re: Wrapper a una DLL

PostPosted: Wed Mar 25, 2009 11:42 pm
by FiveWiDi
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.