Wrapper a una DLL

Wrapper a una DLL

Postby softruz » Mon Mar 23, 2009 1: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.
softruz
 
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re: Wrapper a una DLL

Postby FiveWiDi » Tue Mar 24, 2009 9: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: 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.
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1087
Joined: Mon Oct 10, 2005 2:38 pm

Re: Wrapper a una DLL

Postby Antonio Linares » Tue Mar 24, 2009 9: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41440
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Wrapper a una DLL

Postby softruz » Tue Mar 24, 2009 9: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.
softruz
 
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re: Wrapper a una DLL

Postby Antonio Linares » 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: 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
 
regards, saludos

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

Re: Wrapper a una DLL

Postby softruz » Wed Mar 25, 2009 8: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.
softruz
 
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re: Wrapper a una DLL

Postby FiveWiDi » Wed Mar 25, 2009 8: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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1087
Joined: Mon Oct 10, 2005 2:38 pm

Re: Wrapper a una DLL

Postby softruz » Wed Mar 25, 2009 9: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.
softruz
 
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re: Wrapper a una DLL

Postby Antonio Linares » Wed Mar 25, 2009 9: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41440
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Wrapper a una DLL

Postby softruz » Wed Mar 25, 2009 9: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.
softruz
 
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re: Wrapper a una DLL

Postby Antonio Linares » Wed Mar 25, 2009 9:34 am

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
 
regards, saludos

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

Re: Wrapper a una DLL

Postby softruz » Wed Mar 25, 2009 9:57 am

Muchas gracias Antonio lo prueba y te comento.

Un Saludo.
softruz
 
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re: Wrapper a una DLL

Postby FiveWiDi » Wed Mar 25, 2009 6: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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1087
Joined: Mon Oct 10, 2005 2:38 pm

Re: Wrapper a una DLL

Postby Antonio Linares » Wed Mar 25, 2009 7: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41440
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Wrapper a una DLL

Postby FiveWiDi » 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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1087
Joined: Mon Oct 10, 2005 2:38 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 82 guests