Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Registro de Windows (https://www.clubdelphi.com/foros/showthread.php?t=62162)

Khronos 07-12-2008 03:01:46

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 :confused:
¿Alquién sabe para que sirven? ¿Como puedo solucionar mi problema?

Saludos.

cHackAll 07-12-2008 21:34:33

Cita:

Empezado por Khronos (Mensaje 330057)
...¿Alquién sabe para que sirven?...

msdn

Cita:

Empezado por Khronos (Mensaje 330057)
...¿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

Khronos 07-12-2008 23:23:28

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...


La franja horaria es GMT +2. Ahora son las 16:10: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