Portando de FreePascal a Delphi (facilitar multi-plataforma)

Monday, 11 May 2009

Estoy en la fase de crear un mini-servidor de aplicaciones que se ejecutará en Windows & Linux.

He elegido a FreePascal como la herramienta para realizar la labor de portar el código de Delphi (Windows) a esta plataforma. Ya tengo resuelto los problemas mayores y el hecho de que librerias como la de RemObjects este ya portada a FreePascal es un gran alivio.

Sin embargo, siempre en el camino se van encontrando pequeños inconvenientes.

Una función importante del sistema, es su mecanismo de plugins, los cuales por múltiples razones (técnicas & aburridas) decidi invocarlos usando la tecnica “antigua” pero probada de encadenamiento de comandos y por ello necesito invocar de forma transparente scripts & ejecutables redireccionando la salida y los errores (stdin, stderror) de los comandos. Para los que no entiendan, es similar a abrir la consola del DOS y ejecutar “dir .” y capturar el resultado de pantalla, pero todo sin intervencion del usuario y sin que aparezca la ventana del DOS.

Hacer esto es muy simple. El ejemplo clasico se puede ver en este link. Y bueno, como hacerlo multiplataforma?

Se me ocurrio que ya que voy a portar el programa a FreePascal de todas maneras, pues mirar como lo hacen alli. Y encontre la informacion sobre la clase TProcess. Muy bueno y todo, pero ya que el IDE del FreePascal (lazarus) no es tan productivo como el de Delphi y que igual no he terminado el proceso de preparar el sistema para Freepascal me pregunte que tan viable era hacer una transferencia de codigo a la inversa: Del FreePascal al Delphi.

Y resulto ser mas fácil de lo que esperaba!.

  • Bueno, primero se instala Lazarus desde la página oficial, el cual incluye el compilador FreePascal y el código fuente.
  • El archivo que contiene la clases _TProcess _ esta en ´DIRECTORIO INSTALACION LAZARUS\lazarus\fpc\2.2.5\source\packages\fcl-process\src\process.pp´. (NOTA: La extensión .pp es la por defecto en freepascal).
  • Copie el archivo process.pp & pipes.pp & la carpeta windows al directorio de la aplicación. Dentro de esta carpeta hay unos archivos .inc que son los que contienen el código especifico de cada plataforma, en este caso el windows.
  • Ahora renombre los archivos .pp a .pas. Y copie el contenido de los archivos .inc dentro de cada .pas (por pura conveniencia).
  • Ahora, borre la directiva {$mode objfpc} del inicio de cada .pas.
  • Por último compilar y ver errores. Te saca que no encuentra unos tipos de datos (eje: DWORD), el cual se arregla fácil haciendo click derecho sobre el tipo, menu refactoring/Find Unit.
  • Se corrige este código:

(Ubicado en pipes.pas):

Function CreatePipeHandles (Var Inhandle,OutHandle : THandle) : Boolean;
begin
  Result := CreatePipe (@Inhandle,@OutHandle,@piInheritablePipe,PipeBufSize);
end;

por:

Function CreatePipeHandles (Var Inhandle,OutHandle : THandle) : Boolean;
begin
  Result := CreatePipe (Inhandle,OutHandle,@piInheritablePipe,0);
end;

Y listo!


0 comments | 0 pingbacks | tags: , |

Add post to:
  • Delicious
  • Reddit
  • Slashdot
  • Digg
  • Technorati
  • Google



Add comment

Comments

No comments for this post

Leave a Comment



Search

Enter your email address to subscribe to our newsletter