Newsgroup: it.comp.lang.delphi
Titolo: Apertura file da Explorer su unica applicazione

Ciao
Dopo aver associato da registro una estensione al mio
programma vorrei che se il mio programma è già aperto e
apro da explorer un file con l'estensione registrata
questo venga rilevato dall'istanza aperta del
programma.
Lo scenario è:
Registro l'estensione .MAS e la associo al mio
programma;
Apro una istanza A del mio programma;
Faccio doppio click su un file "pippo.MAS" da explorer;
L'istanza A "apre" il file;
Faccio doppio click su un file "pippo1.MAS" da
explorer;
L'istanza A "apre" il file;
Etc ...
In rete ho trovato trovato una maniera per fare quanto
detto con un Mutex che controlla l'istanza unica del
programma e una registrazione di un opportuno Messaggio
di sistema che permette di inviare, all'istanza aperta,
il percorso del file di cui viene richiesta l'apertura
su una nuova istanza del programma che viene poi
immediatamente chiusa.
In codice:
--------------------------------------------------------
program Multifileload; 
uses 
  windows, 
  Sysutils, 
  Forms, 
  MAIN in 'MAIN.pas' {frmMAIN}, 
  MDIPart in 'MDIPart.pas' {frmSUB}; 
{$R *.RES} 
var 
  dwMutex : DWORD; 
  hWindow : DWORD; 
  dwAtom  : DWORD; 
begin 
  dwMessage := RegisterWindowMessage('{06007663-C0F6-4069-A835-D85AD31B5011}'); 
  dwMutex   := CreateMutex(nil,true,'MultiFileLoad'); 
  try 
    if GetLastError <> ERROR_ALREADY_EXISTS then 
    begin
      Application.Initialize; 
      Application.CreateForm(TfrmMAIN, frmMAIN); 
      Application.Run; 
    end 
    else 
    begin 
      hWindow := FindWindow(nil,'Multifiledemo'); 
      if hWindow <> 0 then 
      begin 
        if (paramcount > 0) and FileExists(paramstr(1)) then 
        begin 
          dwAtom := GlobalAddAtom(PChar(paramstr(1))); 
          SendMessage(hWindow,dwMessage,0,dwAtom); 
        end; 
      end; 
    end; 
  finally 
    if dwMutex <> 0 then 
    begin 
      CloseHandle(dwMutex); 
    end; 
  end; 
end.
------------------------------------------------------
unit MAIN; 
interface 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls, Menus; 
type 
  TfrmMAIN = class(TForm) 
    MainMenu1: TMainMenu; 
    Datei1: TMenuItem; 
    procedure FormShow(Sender: TObject); 
  protected 
    procedure WndProc(var msg : TMessage); override; 
  end; 
var 
  frmMAIN: TfrmMAIN; 
  dwMessage : DWORD; 
implementation 
uses MDIPart; 
{$R *.DFM} 
procedure TfrmMAIN.WndProc(var msg : TMessage); 
var 
  pFileName : PChar; 
  dwLen     : DWORD; 
begin 
  if msg.Msg = dwMessage then 
  begin 
    dwLen     := MAX_PATH+1; 
    pFileName := StrAlloc(dwLen); 
    try 
      GlobalGetAtomName(msg.lParam,pFileName,dwLen); 
      Memo1.Lines.LoadFromFile(pFileName); 
      GlobalDeleteAtom(msg.lParam); 
    finally  
      StrDispose(pFileName); 
    end; 
  end 
  else 
  begin 
    inherited WndProc(msg); 
  end; 
end; 
procedure TfrmMAIN.FormShow(Sender: TObject); 
begin 
  if (paramcount > 0) and FileExists(paramstr(1)) then 
  begin 
    Memo1.Lines.LoadFromFile(paramstr(1)); 
  end; 
end; 
end.
----------------------------------------------------------
Il tutto non mi dispiace ma volevo sapere se
conoscevate un metodo alternativo.
Grazie del contributo.
	Ciao
	MassimoB
 
---------------------------
http://www.massimobeschi.it/

Preciso che non è farina del mio sacco ma per evitare che un programma
venga lanciato due volte utilizzo questo metodo
/// form main della procedura 
    procedure SpeedButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
///
/// il codice del programma
/// 
var
  mHandle: THandle;    // Mutexhandle
initialization
  mHandle := CreateMutex(nil, True, 'NomeFileEseguibile.exe');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    MessageDlg('il programmma è già in esecuzione!', mtError, [mbOK],
0);
    halt;
  end;
finalization
  if mHandle <> 0 then CloseHandle(mHandle)
end.