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 07-12-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Registro de Windows

Hola, necesito que mi aplicación se ejecute cuando se abran ciertos archivos. Para ello uso el registro:

Código:
HKEY_CLASSES_ROOT\.phx\Shell\Open\Command\"C:\MiPrograma\programa.exe" "%1"
Esto funciona correctamente, cuando abro el archivo automaticamente se lanza mi aplicación y capturo la dirección del archivo con paramstr(1).
El problemas está en que quiero que si abro varios archivos me manden todos sus direcciones a mi primera instancia de la aplicación (mediante un mutex consigo que solo se abra una vez mi aplicacion).

Estuve buscando por el registro y vi varias extensiones que tienen claves como OpenWithList o OpenWithProgits
¿Alquién sabe para que sirven? ¿Como puedo solucionar mi problema?

Saludos.
Responder Con Cita
  #2  
Antiguo 07-12-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por Khronos Ver Mensaje
...¿Alquién sabe para que sirven?...
msdn

Cita:
Empezado por Khronos Ver Mensaje
...¿Como puedo solucionar mi problema?...
En el caso de que se seleccionen varios archivos y se ejecute el comando para los mismos, te aconsejo hacer el siguiente cambio;

Código:
HKEY_CLASSES_ROOT\.phx\Shell\Open\Command\"C:\MiPrograma\programa.exe" "%*"
y usar ParamCount.

Tambien es importante que busques en el foro informacion acerca de la "comunicación entre dos aplicaciones", ésto para pasar a la instancia inicial los parametros.

Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #3  
Antiguo 07-12-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Gracias por responder cHackAll, ya encontré la forma de solucionar el problema:

Código Delphi [-]
unit Global;

interface

uses Messages, Classes;

//color = $00FFDDBB;

type
  TPhxMessage = packed record
      DestHandle: THandle;
      Str: string[255];
  end;

const
  Mapping = 'OPAMS-14ASD-MU1EX';
  Mutex = 'E51BA-9QIOSAD-PHOENIX';
  WM_TRANSFER = WM_USER + 1;

var
  Index: integer = 0;
  UpdateOpen: boolean = false;
  UpdateSlider: boolean = false;
  WiniPath: string;

  PhxMessage : ^TPhxMessage;
  mhandle, nHandle: THandle;
  CustomList: TStringList;
  Sychronized: boolean = true;

implementation

end.

Código Delphi [-]
program phxmp;

uses
  ComCtrls,
  Forms, Classes,
  XPMan, Messages,
  SysUtils,  Windows, dialogs,
  frm_main in 'frm_main.pas' {FMain},
  frm_skins in 'frm_skins.pas' {FSkins},
  PlayerUtils in 'PlayerUtils.pas',
  Global in 'Global.pas',
  uThreadFiles in 'uThreadFiles.pas',
  uPlayList in 'uPlayList.pas';

{$R *.res}

begin
  WiniPath:= ExtractFilePath(paramstr(0)) + 'Options.ini';
  Application.Initialize;
  Application.CreateForm(TFMain, FMain);
  Application.CreateForm(TFSkins, FSkins);


  CreateMutex(nil, True, Mutex);
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
     if ParamCount = 1 then
      begin
        nHandle:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, pchar(Mapping));
        if nHandle = 0 then raise Exception.Create('Error ¿?');
        PhxMessage:= MapViewOfFile(nHandle,FILE_MAP_ALL_ACCESS,0,0,0);
        PhxMessage^.Str:= paramstr(1);
        PostMessage(PhxMessage^.DestHandle, WM_TRANSFER, 0 ,0);
        UnmapViewOfFile(PhxMessage);
        CloseHandle(nHandle);
      end;
      ExitProcess(0);
  end else
    begin
     mHandle:= CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0, SizeOf(TPhxMessage), pchar(Mapping));
     PhxMessage:=MapViewOfFile(mHandle, FILE_MAP_WRITE,0,0,0);
     PhxMessage^.DestHandle:= FMain.Handle;
    end;

  Application.Title:= 'Phoenix Media Player';
  Application.Run;
end.


Y después en el Form:

Código Delphi [-]
  public
    procedure HookMessage (var Msg: TMessage); message WM_TRANSFER;
  end;

var
  FMain: TFMain;

implementation

{$R *.dfm}

procedure TFMain.HookMessage(var Msg: TMessage);
var
Thread: TMFThread;
begin
    if CheckCompability(PhxMessage^.Str) = true then
      begin
        CustomList.Add(PhxMessage^.Str);
        Thread:=TMFThread.Create(CustomList);
        CustomList.Clear;
      end;
end;

Funciona perfectamente, registro las extensiones en el registro y solo se abre un única instancia de mi aplicación. Pero me surge un error, cuando abro muchos archivos por la sincronización de los thread que espero resolver pronto.

Muchas gracias Saludos.

PD: Tengo que resolver el problema del BufferOverflow...

Última edición por Khronos fecha: 07-12-2008 a las 23:28:23.
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
registro de windows JULIPO Varios 4 26-07-2007 08:17:01
Uso de registro de Windows Alcolea Windows 3 05-06-2006 21:47:35
actualizar registro de windows jmeng2 Varios 2 08-12-2004 16:44:02
registro de Windows ebeltete API de Windows 1 17-06-2003 17:00:14
Registro de Windows Periyo Varios 3 08-05-2003 17:51:51


La franja horaria es GMT +2. Ahora son las 00:43:46.


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