Uso de funciones pipe del API

Uso de funciones pipe del API

Postby Jorge Jaurena » Wed Jan 11, 2017 3:06 pm

Buen dia, estoy tratando de usar las funciones pipe del api y no logro que funcionen, quizas estoy definiendolas mal.
Las funciones las encontre en el MSDN de microsoft.

Para conectar a un pipe existente la funcion del api que encuentro es la siguiente:
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);


Y yo la estoy definiendo en mi prg de la siguiente manera:
DLL32 FUNCTION CreateFile(lpFileName AS STRING, dwDesiredAccess AS LONG, dwShareMode AS LONG, lpSecurityAttributes AS LONG,;
dwCreationDisposition AS LONG, dwFlagsAndAttributes AS LONG, hTemplateFile AS LONG) AS LONG;
LIB "Kernel32.dll"


El pipe existe y con otra aplicacion responde correctamente pero a mi me devuelve siempre nil en lugar de un handle.
Muchas gracias.

Jorge Jaurena
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Uso de funciones pipe del API

Postby Antonio Linares » Wed Jan 11, 2017 6:22 pm

Añade esto:

... FROM "CreateFileA" LIB "Kernel32.dll"
regards, saludos

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

Re: Uso de funciones pipe del API

Postby Jorge Jaurena » Fri Jan 13, 2017 2:56 pm

Gracias por la respuesta, pero porque la A final al nombre de la funcion en FROM?
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Uso de funciones pipe del API

Postby Antonio Linares » Fri Jan 13, 2017 3:36 pm

En el fichero winbase.h de Windows encontramos:

#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE

Es decir, la función CreateFile se transforma en CreateFileA ó CreateFileW según se esté usando ó no unicode.

Por eso tenemos que indicarle a DLL FUNCTION ... que queremos usar CreatetFileA
regards, saludos

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

Re: Uso de funciones pipe del API

Postby Jorge Jaurena » Fri Jan 13, 2017 7:53 pm

Gracias Antonio, segui tu consejo y algo cambio, ya no regresa nil pero me da un error que sinceramente no entiendo que es, genera un archivo hb_out.log con el siguiente contenido:

Application Exception - C:\CEM-44\CEM44PIPES.EXE
Terminated at: 2017.01.13 16:46:07

Exception Code:C0000005
Exception Address:00000000
EAX:00503290 EBX:00000000 ECX:FFFFFFFF EDX:00000007
ESI:00000000 EDI:00AC76F8 EBP:00000000
CS:EIP:001B:00000000 SS:ESP:0023:0012F2EC
DS:0023 ES:0023 FS:003B GS:0000
Flags:00010212
CS:EIP:
SS:ESP: 0012F3F0 004406C2 00000008 00AC7578 00000000 00494578 0012F37C 00000000 00000000 00000000 001A0018 7FFDFC00 00000000 006B0000 0012F358 00AC7638

C stack:
EIP: EBP: Frame: OldEBP, RetAddr, Params...

Estoy probando mi aplicacion en la misma pc donde existe el pipe para evitar otros errores externos y estas son las lineas que ejecuta:

lpszPipename := "\\.\pipe\CEM44POSPIPE"
hPipe := 0
hPipe := CreateFile(lpszPipename)

Gracias
Jorge Jaurena
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Uso de funciones pipe del API

Postby Antonio Linares » Fri Jan 13, 2017 8:29 pm

Jorge,

Por qué le pasas un sólo parámetro a la función CreateFile() ?

Tienes que enviarle todos los parámetros
regards, saludos

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

Re: Uso de funciones pipe del API

Postby Jorge Jaurena » Sat Jan 14, 2017 12:35 pm

Probe enviando solo el nombre del pipe asumiendo que el resto los pondria la funcion por default al no recibirlos, la intencion era minimizar errores mios pero quizas necesite que los pase, voy a probar pasandolos todos. Gracias

Jorge Jaurena
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Uso de funciones pipe del API

Postby Jorge Jaurena » Mon Jan 16, 2017 3:14 pm

Antonio, buen dia. Segui tu consejo de pasarle todos los parametros pero me sigue dando el mismo error, sinceramente no tengo demasiado tiempo para esto por eso mi pregunta es la siguiente: ¿la nueva version de FWH trae alguna clase que me facilite el uso de pipe? Gracias.
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Uso de funciones pipe del API

Postby Antonio Linares » Tue Jan 17, 2017 6:12 am

Jorge,

Que parámetros le has pasado ?

Copia aqui tu código para poder probarlo, gracias
regards, saludos

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

Re: Uso de funciones pipe del API

Postby goosfancito » Tue Jan 17, 2017 7:33 am

hace unos 8 años en mi trabajo, en ese momento, habiamos necesitado utilizar las PIPE porque
la aplicación que estaba siendo utilizada para sistemas de expendedores de combustible asi lo requeria.
estuve aproximadamente 7 meses intentando que eso funcione, pude generarla y enviar información
pero mas que eso no se pudo. no pudimos hacer andar que le enviemos información a la pipe
y que nos responda. el ida / vuelta no nos funcionó.

creo que despues (ya no estoy mas en esa empresa) cambiaron de lenguaje de programacion.

no tengo ningun fuente de lo que pudimos hacer con las pipes.

gracias.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: Uso de funciones pipe del API

Postby Jorge Jaurena » Thu Jan 19, 2017 2:13 pm

Antonio, buen dia, te paso lo que estoy ejecutando.
Le estoy pasando todos los parametros basandome en el ejemplo que hay en el msdn.

Function VerTareas()
Local hPipe,lpszWrite,chReadBuf[512],fSuccess,cbRead,dwMode,lpszPipename,Ret

oTimer:DeActivate()

lpszWrite := "Default message from client"
lpszPipename := "\\.\pipe\CEM44POSPIPE"
hPipe := 0

hPipe := CreateFile(lpszPipename, "GENERIC_READ | GENERIC_WRITE", 0, "", "OPEN_EXISTING", 0, "")
* MsgInfo(hPipe,"Handle retornado")

oTimer:Activate()
Return nil

A continuacion te paso como estoy definiendo la funcion, basandome en el msdn de microsft.

DLL32 FUNCTION CreateFile(lpFileName AS STRING, dwDesiredAccess AS LONG, dwShareMode AS LONG, lpSecurityAttributes AS LONG,;
dwCreationDisposition AS LONG, dwFlagsAndAttributes AS LONG, hTemplateFile AS LONG) AS LONG;
FROM "CreateFileA" LIB "Kernel32.dll"

Gracias
Jorge Jaurena
Jorge Jaurena
 
Posts: 146
Joined: Fri Oct 21, 2005 6:35 pm

Re: Uso de funciones pipe del API

Postby Antonio Linares » Thu Jan 19, 2017 4:06 pm

Jorge,

En vez de "GENERIC_READ | GENERIC_WRITE" tienes que usar nOr( GENERIC_READ, GENERIC_WRITE )

Los parámetros que tienes definidos como LONG tienen que ser números y no cadenas.

Busca esos defines en los ficheros de cabecera del compilador de C

Lo mismo para "OPEN_EXISTING". Debe ser un número.
regards, saludos

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 87 guests