Pregunta

Estoy interesado en llamar a SoX , una aplicación de consola de código abierto, desde otro programa GUI de Windows ( escrito en Delphi naturalmente). En lugar de tratar de raspar y ocultar la ventana de la consola, me gustaría convertir la aplicación a un archivo DLL al que pueda llamar desde mi aplicación.

Antes de comenzar por este camino, tengo curiosidad por saber cuánto trabajo debo esperar. ¿Estamos hablando de una empresa importante, o hay una solución directa? Sé algo de C, pero de ninguna manera soy un experto.

No espero detalles específicos de SoX, solo la conversión de la aplicación de consola EXE a DLL en general. Sin embargo, si alguien está familiarizado con SoX, aún mejor.

¿Fue útil?

Solución

Para el tema específico de convertir un ejecutable de consola en una biblioteca modificando el código fuente C, depende de cómo se factoriza la aplicación de línea de comandos. Si está escrito de tal manera que la E / S se canaliza a través de un pequeño conjunto de funciones o incluso mejores punteros de función, entonces obviamente será trivial.

Si todo se hace con printf, scanf y amigos, probablemente sea mejor encontrar / crear un archivo de inclusión que incluyan todos los archivos de origen y agregar una macro que redirija a printf / scanf y amigos a sus propias funciones que están escritos para poder implementar DLL. Cosas como printf se pueden construir a partir de vsnprintf (use la versión n por seguridad), por lo que no necesita volver a implementar todo el subsistema de E / S C RTL. Sin embargo, no hay vsscanf, pero hay implementaciones de terceros en la web.

Si el código usa fprintf, fscanf, etc. para habilitar la indirección entre los archivos y la consola, todavía no tiene suerte. La estructura FILE es opaca y, a diferencia de los archivos de texto Pascal, no se puede implementar un controlador de archivo de texto portátil. Todavía podría ser posible si escribe en su C RTL específico, pero le recomendamos que siga la ruta macro y vuelva a implementar su propio tipo de archivo renombrado.

Finalmente, el " popen () " El enfoque es posible en Delphi y se hizo algo más fácil en Delphi 2009 con las clases TTextReader y TTextWriter. Combine esto con TFileStream envuelto alrededor de tuberías y especifique tuberías para entrada estándar, salida estándar y error estándar en el nuevo proceso y STARTF_USESTDHANDLES, etc., y funcionará. Si no tiene ganas de escribir el suyo, también hay ejemplos / equivalentes de terceros en la web para Delphi. Aquí hay uno.

Otros consejos

En Windows, simplemente llame a CreateProcess con el comando SoX línea. No conozco los enlaces de Delphi para Win32, pero he hecho exactamente esto en Win32 y C #.

Y ahora que sabe que CreateProcess es lo que quiere llamar, una búsqueda en Google sobre cómo hacerlo desde Delphi debería proporcionarle todo el código que necesita.

Artículo de Delphi Corner - Uso de CreateProcess para ejecutar programas

Llamando a CreateProcess () de la manera fácil

Puede que ni siquiera necesite una DLL, puede usar la función popen () para ejecutar una aplicación de consola y recopilar cualquier texto de salida.

Descargo de responsabilidad: no sé nada sobre SoX. Puede ser que el código esté estructurado para facilitar esto, o puede ser más difícil. De cualquier manera, el proceso es el mismo:

Primero, desea encontrar las funciones en la aplicación SoX a las que desea llamar. Lo más probable es que la aplicación de consola tenga código para analizar la línea de comando y llamar a las funciones apropiadas. Primero, encuentre las funciones que desea usar.

A continuación, consulte la información sobre la exportación de funciones en archivos DLL desde C en este sitio: Creación y Uso de archivos DLL

Luego cree un nuevo archivo de proyecto de archivo visual o de estudio visual con el objetivo como una DLL, y agregue los archivos fuente del programa SoX que ha modificado para exportar.

Ejecute el proceso, de la forma en que Indiv aconsejó y capturó la salida, como Adam ha mostrado.

Sin embargo, si aún desea realizar la conversión de DLL, esto lo ayudará a comenzar

  1. Configure SOX para Windows y compílelo
  2. Cree un proyecto DLL vacío con su herramienta C ++
  3. Agregue los archivos SOX para formar parte del proyecto
  4. Agregar una nueva función llamada DLLMain

    BOOL APIENTRY DllMain (MANGO hModule,                    DWORD ul_reason_for_call,                    LPVOID) {return TRUE;}

  5. Agregue un archivo .DEF (use el nombre del proyecto como nombre de archivo) que enumera las exportaciones en la DLL: agregue el siguiente contenido

    LIBRARY      "name.DLL" 
    

    EXPORTACIONES

    CallOldMain PRIVATE

  6. Cambie el nombre del SOX principal como CallOldMain

  7. Escriba una función PERSONALIZADA para registrar el error de salida / retorno, etc.

  8. Encuentre todos los printfs / cout en la aplicación SOX y reemplácelos con llamadas a su función personalizada arriba

  9. Una vez que se compila la DLL, ahora puede llamar a la función CallOldMain con los mismos parámetros que los programas principales de C esperan. Puede modificar esta firma para devolver los errores / resultados de arriba.

No mencionas cuál es tu cadena de herramientas, pero si configuras gcc en Windows, puedes usar la configuración normal; make; make install solo para compilar sox. En el proceso, creará un archivo dll y la aplicación de consola. O bien, puede especificar el objetivo de hacer solo para hacer el dll. Esto compilará una biblioteca nativa de Windows que solo depende del dll de tiempo de ejecución de MS C, y puede usar esto en su propia aplicación.

Puede ejecutar una aplicación de consola y capturar su salida utilizando tuberías. Utiliza un lado de la tubería como stdout para CreateProcess y lee desde el otro lado como un archivo común.

Puede ver un ejemplo de trabajo escrito en Delphi aquí: http: // delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

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