Uso de funciones pipe del API
-
- Posts: 155
- Joined: Fri Oct 21, 2005 6:35 pm
Uso de funciones pipe del API
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
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
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
-
- Posts: 155
- Joined: Fri Oct 21, 2005 6:35 pm
Re: Uso de funciones pipe del API
Gracias por la respuesta, pero porque la A final al nombre de la funcion en FROM?
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
Re: Uso de funciones pipe del API
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
#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
-
- Posts: 155
- Joined: Fri Oct 21, 2005 6:35 pm
Re: Uso de funciones pipe del API
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
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
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
Re: Uso de funciones pipe del API
Jorge,
Por qué le pasas un sólo parámetro a la función CreateFile() ?
Tienes que enviarle todos los parámetros
Por qué le pasas un sólo parámetro a la función CreateFile() ?
Tienes que enviarle todos los parámetros
-
- Posts: 155
- Joined: Fri Oct 21, 2005 6:35 pm
Re: Uso de funciones pipe del API
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: 155
- Joined: Fri Oct 21, 2005 6:35 pm
Re: Uso de funciones pipe del API
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.
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
Re: Uso de funciones pipe del API
Jorge,
Que parámetros le has pasado ?
Copia aqui tu código para poder probarlo, gracias
Que parámetros le has pasado ?
Copia aqui tu código para poder probarlo, gracias
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: Uso de funciones pipe del API
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.
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.
-
- Posts: 155
- Joined: Fri Oct 21, 2005 6:35 pm
Re: Uso de funciones pipe del API
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
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
- Antonio Linares
- Site Admin
- Posts: 42513
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 73 times
- Contact:
Re: Uso de funciones pipe del API
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.
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.