FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Uso de funciones pipe del API
Posts: 155
Joined: Fri Oct 21, 2005 06:35 PM
Uso de funciones pipe del API
Posted: Wed Jan 11, 2017 03: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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Uso de funciones pipe del API
Posted: Wed Jan 11, 2017 06:22 PM

A帽ade esto:

... FROM "CreateFileA" LIB "Kernel32.dll"

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 155
Joined: Fri Oct 21, 2005 06:35 PM
Re: Uso de funciones pipe del API
Posted: Fri Jan 13, 2017 02:56 PM

Gracias por la respuesta, pero porque la A final al nombre de la funcion en FROM?

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Uso de funciones pipe del API
Posted: Fri Jan 13, 2017 03: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
Posts: 155
Joined: Fri Oct 21, 2005 06:35 PM
Re: Uso de funciones pipe del API
Posted: Fri Jan 13, 2017 07: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

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Uso de funciones pipe del API
Posted: Fri Jan 13, 2017 08: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
Posts: 155
Joined: Fri Oct 21, 2005 06:35 PM
Re: Uso de funciones pipe del API
Posted: 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

Posts: 155
Joined: Fri Oct 21, 2005 06:35 PM
Re: Uso de funciones pipe del API
Posted: Mon Jan 16, 2017 03: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.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Uso de funciones pipe del API
Posted: Tue Jan 17, 2017 06: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
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: Uso de funciones pipe del API
Posted: Tue Jan 17, 2017 07: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/
Posts: 155
Joined: Fri Oct 21, 2005 06:35 PM
Re: Uso de funciones pipe del API
Posted: Thu Jan 19, 2017 02: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

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Uso de funciones pipe del API
Posted: Thu Jan 19, 2017 04: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

Continue the discussion