Pregunta

Escribí una pequeña aplicación de consola para empaquetar una DLL de terceros que tiene problemas.Lo estoy llamando desde una aplicación GUI usando _popen, y solo quiero leer un valor de la salida estándar del programa de consola.Al hacerlo, se muestra brevemente una ventana de consola no deseada.

Soy consciente de que esto se puede evitar utilizando una determinada configuración de STARTUPINFO con CreateProcess.Sin embargo, preferiría poner la solución en la aplicación de consola y seguir usando _popen.Crear el proceso hijo utilizando el subsistema de Windows (es decir,WinMain en lugar de main) no hace que la ventana de la consola desaparezca.Aparentemente, el sistema operativo asigna una consola para facilitar la comunicación _popen.

Tenga en cuenta que la DLL de terceros es inestable, pero necesaria para interactuar con el hardware propietario.Por lo tanto, cualquier enfoque que cargue la DLL en el espacio de memoria de las aplicaciones GUI es inaceptable.

¿Fue útil?

Solución

1) Apoyo la idea de ejecutarlo con STARTUPINFO configurado para ocultar la ventana.Este es el SOP en Windows, por lo que funcionará mejor que intentar imponer el SOP de Unix.Además, es posible que desee ver el resultado cuando lo pruebe de forma aislada.

2) O puede crear una aplicación GUI que nunca muestre una ventana.Equivale a una aplicación de consola sin consola.

editar

El enlace La publicación de Indeera muestra cómo hacer la segunda opción.

editar

Ok, si lo único que quieres es enviar información a los padres, la forma más sencilla es escribir un archivo.Una forma de mantener esto ordenado es hacer que el padre pase un nombre de archivo único como parámetro de línea de comando, en el que escribe el niño.El padre puede monitorear el archivo y actuar sobre su contenido.

Hay muchas alternativas.Lo más cercano a los dos enfoques discutidos hasta ahora serían las canalizaciones con nombre, pero también se pueden usar varias formas de IPC, incluidas las basadas en sockets.

Sin embargo, lo que no puede hacer es acceder a stdin/stdout/stderr sin una consola.Puedes iniciar con una consola oculta, pero en realidad debe tener una.

editar

¿Lua permite ejecutar el ejecutable directamente, en lugar de hacerlo a través de cmd.exe?

Otros consejos

Para establecer comunicación entre una aplicación GUI padre y un hijo aplicación de consola oculta referencia a los siguientes artículos de MSDN:

No creo que se puede usar stdin / stdout sin ella puesta en marcha de la consola. Lo que puede hacer, sin embargo, es escribir la aplicación envoltorio como una aplicación de interfaz gráfica de usuario que no muestra ninguna ventana (solo interruptor principal () para WinMain ()) y luego usar algún tipo de mecanismo IPC como una toma de corriente o de memoria compartida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top