Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 14-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 14-07-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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"?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 14-07-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Khronos Ver Mensaje
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
Responder Con Cita
  #5  
Antiguo 14-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Gracias por responder, voy a probar lo que dices dec.

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

Voy a probar el metodo de dec y os cuento.

Salu2
Responder Con Cita
  #6  
Antiguo 14-07-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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

// Saludos
Responder Con Cita
  #7  
Antiguo 14-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
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

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

Salu2
Responder Con Cita
  #8  
Antiguo 14-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
obtener el nombre de varios archivos rzf1983 Varios 4 24-10-2007 18:18:29
problema con formularios que se llaman mutuamente Patricio Varios 9 12-12-2006 19:38:52
Obtener duración de archivos de video unasdudas Varios 2 19-12-2005 04:56:51
Obtener los archivos de un directorio MRSAM Varios 16 03-08-2005 21:37:12
obtener un listado de archivos JorgeBec Varios 6 24-12-2004 14:58:00


La franja horaria es GMT +2. Ahora son las 21:07:02.


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
Copyright 1996-2007 Club Delphi