Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Incluir un fichero en el ejecutable (https://www.clubdelphi.com/foros/showthread.php?t=32491)

RaulChemical 07-06-2006 17:03:52

Incluir un fichero en el ejecutable
 
Hola de nuevo. Este es mi segundo hilo del dia:

Tengo que incluir dentro de mi ejecutable (en este caso, una .dll) un archivo, concretamente un excel que tengo que extraer para hacer una serie de historias con el.

He estado trasteando en el trucomania y he encontrado un truco en el que incluyen dentro del ejecutable un jpg para mostrarlo en la tipica ventanita de splash.

Código Delphi [-]
var 
   Corriente   : TResourceStream;
   Imagen      : TJPegImage;
begin 
  Imagen:=TJPegImage.Create;
  Corriente:=TResourceStream.Create( hInstance,
                                     '#1',
                                     RT_RCDATA );
  Corriente.Seek(0,soFromBeginning);
  Imagen.LoadFromStream(Corriente);
  Image1.Canvas.Draw(0,0,Imagen);
  Imagen.Free;
  Corriente.Free;
end;


Mi pregunta es saber si igual que carga el TImage a partir del ResourceStream, se puede cargar un TFileStream con el fichero que incluyo dentro del .res y hacer un SaveToFile para guardar en disco el fichero y operar con el.


Hemos estado barajando la posibilidad de tener un directorio con los exceles a tratar, pero lo hemos descartado ya que el cliente es un poco "tocón" y ya se ha cargado archivos de los que usamos, incluso los Ini's.


Muchas gracias por todo.

Raul.

dec 07-06-2006 17:14:16

Hola,

Sí que puedes hacer lo que dices, me parece a mí. Descarga el ejemplo "Incluir un archivo de texto en una DLL y después extraerlo" que puedes encontrar en mi página Web personal e intransferible. Justamente, encontrarás el ejemplo que te digo en el apartado Código Delphi.

Pensaba reproducirlo aquí mismo, su código y eso, pero, el ejemplo contiene además algo de documentación, en fin, texto que acaso pueda servir de alguna ayuda. En todo caso, si tienes algún problema o necesitas de alguna aclaración... adelante. :)

Neftali [Germán.Estévez] 07-06-2006 17:26:25

Por pasos:

(1) Crea un hoja de Excel; Supongamos test.xls
(2) Crea un archivo .rc; Datos.rc
(3) Escribe dentro:
EXCEL RCDATA .\test.xls
(4) Compilalo desde la línea de comandos con:
brcc32 datos.Rc
(5) Debe generar un fichero .RES llamado Datos.res con un tamaño casi igual al fichero test.xls
(6) En el fichero DPK de tu proyecto, donde está el código:
Código Delphi [-]
  {$R *.res}
Añade:
Código Delphi [-]
  {$R Datos.res}

(7) Pon un botón y en el evento OnClik escribe:
Código Delphi [-]
var
  // Steam para recuperar el recurso
  RS : TResourceStream;
begin
  // Crear a partir del recurso
  RS := TResourceStream.Create( 0, 'EXCEL', RT_RCDATA);
  try
    // Grabar en un fichero
    RS.SaveToFile('c:\temp\Salida.xls');
  finally
    // Liberar
    RS.Free;
  end;

(8) Al ejecutarlo y pulsar el botón se te habrá creado el fichero de excel en el directorio especificado.

Creo que no me dejo nada; Pruébalo y ya dirás...

RaulChemical 07-06-2006 17:31:23

Muchisimas gracias.
Ahora mismo me pongo con ello.


Ya os contaré.

Raulete.

JXJ 07-06-2006 18:31:35

hola RaulChemical

¿que funcionalidad se obtiene, con meter el archivo
excel. dentro del ejecutable?

no entiendo. el escenario. en el que es mejor incluir el archivo
dentro del exe. que el proporcinarlos el exe y el xls, por separado
o en un comprimido rar o zip. etc.

Sick boy 07-06-2006 19:33:04

Cita:

¿que funcionalidad se obtiene, con meter el archivo
excel. dentro del ejecutable?
A mi se me ocurre una, que sabes que cada vez que lo extraes encuentras el excel tal y como lo pusiste en la DLL.

Vamos, que es imposible que el cliente abra la DLL y se ponga a enredar, mientras que en un zip o por separado puede modificarlo.

Supongo que cada vez que lo quiera usar lo extrae, machacando el excel que tenia anteriormente.

Y si quieres, cuando termines de trabajar lo borras para que no quede rastro.

Me parece una muy buena idea, salvo porque odio excel :D

RaulChemical 08-06-2006 10:50:03

Pues si, como bien dice Sick boy (veo que eres fan de trainspotting), la intencion de meter el excel en la dll es para que el cliente no pueda modificarlo o eliminarlo (cosa que ya nos ha hecho varias veces con el excel anterior). Lo extraemos en el temp de windows :( , lo rellenamos y se lo mostramos. Si quiere hacer un guardar como, que lo haga y si no, se queda en el temp y nos lo cargaremos con la siguiente ejecucion del proceso.

Lo del excel es por exigencias del guion, inicialmete era un qreport, luego nos lo pidieron exportar a excel (con un formato que ellos nos "impusieron") y luego dijeron que pasaban del qreport.
En fin, a ver que tal queda. Suerte que tenemos el upx para que no engorde tanto la dll con el excel.

Sick boy 08-06-2006 11:04:55

Sip, me encanta Trainspotting (no por el tema del caballo, que no me interesa).

Y tu?? Eres fan de los chemical brothers o del Quimicefa ??? :D :p :D

Seguro que queda bien, y el UPX es muy bueno.

Para cuando nos pediran los clientes exportar a OpenDocument ??
Se aceptan apuestas

RaulChemical 08-06-2006 11:16:52

Es por los chemical brothers.

Mi apuesta por lo del OpenDocument es nunca mientras el cliente sea parthner (o como se escriba) de Micros....

Mientras no se acaben los afanes imperialistas de algunos y la ambicion de otros seguiremos estando agarrados a "estandares" como el excel o el guord.

Con la de birguerias que se pueden hacer con el xml o incluso el rtf.

En fin....

acertij022 08-06-2006 21:00:34

Si la idea es incoporar algun archivo en el interior del ejecutable se puede cargar todo en una variable tipo string.

hacer un pequeño programa que habra el archivo tipo char y guardarlo en un txt
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
ff:file of char;
FText:textFile;
char1:char;
str1:string;

begin
assignfile(ff,'a.exe');
Reset(ff);
while not eof do
 begin
 Read(ff,char1);
 str1:=str1+'#'+IntToStr(ord(char1));
 end;
closeFile(ff);

assignfile(FText,'a.exe');
ReWrite(FText);
WriteLn(FText,str1);
CloseFile(Ftext)
end;

El resultado del archivo de texto generado guardarlo en string en nuestra aplicacion y por medio de este codigo lo sacamos

Código Delphi [-]
procedure StrToFile(Texte: String; Fitxer: String);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(Fitxer, fmCreate);
  try
    Stream.WriteBuffer(Pointer(Texte)^, Length(Texte));
  finally
    Stream.Free;
  end;
end;
Creo que este sistema se le dice archivo mochila.
Espero que esto te sirva ;)


La franja horaria es GMT +2. Ahora son las 01:09:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi