Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Obtener archivos que llaman a mi aplicacion (https://www.clubdelphi.com/foros/showthread.php?t=58245)

Khronos 13-07-2008 22:57:36

Obtener archivos que llaman a mi aplicacion
 
Esto lo necesito para una aplicacion que estoy haciendo.. Pondré un ejemplo:
Si seleccionamos varias canciones y le damos a boton derecho>abrir, nos saldrá el reproductor predeterminado que tengamos y nos cargará todas las canciones seleccionadas que tengamos.. yo necesito conseguir la ruta de todos los archivos que llamaron a mi aplicacion..

Con paramstr(1) consigo la direccion de la primera, pero paramstr(2) y los parametros consecutivos me vienen vacios.. mi aplicacion se abre tantas veces como archivos haya seleccionado, esto lo sulocione y consegui que mi aplicacion se abriera solo una vez mediante un mutex.. pero no se como conseguir la ruta de los archivos que llaman a mi aplicacion :(

Salu2 y gracias.

Khronos 14-07-2008 11:27:47

Estuve pensando en como solucionar esto y se me ocurrio una cosa pero no se si se puede hacer. ¿Se podrían obtener los archivos seleccionados en el explorador de windows?
Con el método shellexecute se pueden seleccionar archivos.

Salu2

dec 14-07-2008 15:19:34

Hola,

Acabo de hacer la prueba con una aplicación Delphi "vacía", y, si "arrastro" a su ejecutable varios archivos, puedo obtener las rutas de estos mediante "ParamStr()", concretamente, se cuenta con tantos parámetros como archivos se han "arrastrado" al ejecutable, podrías verlo así:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to ParamCount-1 do begin
    Memo1.Lines.Add(Format(
     'Parámetro: %d - Valor: %s', [i, ParamStr(i)]
    ));
  end;
end;

Ahora bien, yo supongo que esto tiene que ser también así en caso de que sea Windows quien llame a tu programa luego de que el usuario eligiera el comando "Abrir con tu programa" del menú contextual del explorador de archivos. ¿Lo has comprobado? ¿Has recorrido todos los parámetros disponibles y estos no contienen la ruta de todos los archivos "seleccionados"?

roman 14-07-2008 16:11:45

Cita:

Empezado por Khronos (Mensaje 300108)
mi aplicacion se abre tantas veces como archivos haya seleccionado, esto lo sulocione y consegui que mi aplicacion se abriera solo una vez mediante un mutex.. pero no se como conseguir la ruta de los archivos que llaman a mi aplicacion

Yo ceo que ahí mismo tienes la solución: cuando "abres" varios archivos de la manera que indicas, el explorador abre tantas copias de tu aplicación como archivos tengas seleccionados. A cada copia se le pasa un sólo parámetro, que es uno de los archivos. Cuál es este parámetro lo sabes al momento de crear el mutex y ver que ya hay uno anterior. Lo que tendrías que hacer es mandarle ese parámetro a la primera copia abierta.

Pienso que una posible forma de hacer esto último es creando un MemoryMapped File o bien con el mensaje WM_COPYDATA.

// Saludos

Khronos 14-07-2008 20:02:39

Gracias por responder, voy a probar lo que dices dec.

Lo de un memorymappedfile ya lo probé y no me salió del todo bien :D pero con más tiempo puede ser la solución.

Voy a probar el metodo de dec y os cuento.

Salu2

roman 14-07-2008 20:10:09

Pero, ¿cuál es el método de dec? Al arrastrar los archivos como él dice, ciertamente se generan muchos parámetros para una sóla instancia de la aplicación. Pero si el usuario hace lo que describiste al principio entonces seguirá pasando lo que describiste al principio :p

// Saludos

Khronos 14-07-2008 20:16:27

Tienes razón roman el método de dec sigue dando el mismo problema, hace algún tiempo hice dos aplicaciones que se enviaban mensajes entre ellas con un filemapping, la acabo de encontrar :D

Cuando termine el código lo subiré aqui o en la sección de trucos.

Salu2

Khronos 14-07-2008 20:30:14

Bueno, ya tengo un poco planteado el algoritmo..

Código Delphi [-]
unit FileMapping;

interface

uses Windows, SysUtils, Messages, dialogs;

const
  wm_Transfer = wm_User + 13;

type
Mensaje = ^TMensaje;
  TMensaje = packed record
    DestHandle: THandle;
    filename: string[255];
  end;

function RunFileMapping(AppHandle: THandle; Mapping: string): boolean; stdcall;

implementation

function RunFileMapping(AppHandle: THandle; Mapping: string): boolean;
var
  Handle: THandle;
begin
  Handle:= OpenFileMapping(FILE_MAP_READ,False,pchar(Mapping));
  if Handle <> 0 then begin
  showmessage('Abriendo mapeado de memoria');
   //Por lo tanto hay otra instancia de la aplicacion
   //aqui enviamos un mensaje a la primera aplicacion con el paramstr(1);
  end;

  if Handle = 0 then begin
    CreateFileMapping( $FFFFFFFF,nil,PAGE_READWRITE,0, SizeOf(TMensaje), pchar(Mapping));
    showmessage('Creado mapeado de memoria');
  end;

end;

Con PostMessage(Mensaje.^DestHandle, WM_TRANSFER, 0, 0) ya conseguí enviar un mensaje...

Salu2


La franja horaria es GMT +2. Ahora son las 23:16:58.

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