So che l'ho già fatto ma non riesco a ricordare come.Delphi Limitazione di una singola istanza di un programma in base ai parametri della riga di comando
Ho un programma che ho impostato per eseguire singleton utilizzando il mutex sul nome dell'eseguibile. unità GlobalSU;
interface
function IsAppRunning: Boolean;
implementation
uses
Windows, SysUtils, Forms;
function IsAppRunning: Boolean;
var
rtn : Cardinal;
begin
result := False;
CreateMutex(nil, False, PWideChar(ExtractFileName(Application.ExeName)));
rtn := GetLastError;
if rtn = ERROR_ALREADY_EXISTS then
result := True;
end;
Il programma accetta determinati parametri della riga di comando che determinano su quali dati agire. Non voglio più di un'istanza del programma in esecuzione con gli stessi argomenti della riga di comando. Ma voglio essere in grado di avviare una seconda istanza con argomenti diversi.
L'ho fatto circa un anno fa ma non ricordo come. Modifico il nome con i parametri della riga di comando nel DPR e poi lo collaudo con il mutex.
Ho provato a rinominare Application.ExeName ma è di sola lettura, quindi devo aver cambiato qualcos'altro.
Di seguito è riportato un codice che non verrà compilato ma aggiunto per chiarire cosa voglio fare. btw - il '##" è sempre i primi due caratteri della 3 parametri, ma i test per questo con una regex
program EPRmailer;
uses
Vcl.Forms,
uMainMailer in 'uMainMailer.pas' {frmMainMailer},
configXML in 'configXML.pas',
GlobalSU in 'GlobalSU.pas',
CVUtils in 'CVUtils.pas',
QMConst in 'QMConst.pas',
ServerAttachmentDMu in 'ServerAttachmentDMu.pas';
{$R *.res}
var
i : integer;
begin
for i := 0 to ParamCount do
if TestParam('##', ParamStr(i)) then
Application.ExeName := Application.ExeName + '-' + ParamStr(i);
if IsAppRunning then exit;
Application.Initialize;
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
Application.MainFormOnTaskbar := false;
Application.CreateForm(TfrmMainMailer, frmMainMailer);
frmMainMailer.RunEPR;
end.
Se la domanda 'foo.exe -a -b' trattata come uguale a' foo.exe - b -a' e 'foo.exe -B -a'? –
Il parametro per il nome del mutex può essere al massimo 'MAX_PATH' lungo che non è sufficiente ad es. per il passaggio di ca. Parametri della riga di comando di 250 caratteri ('MAX_PATH - 'EPRmailer''). In tal caso la creazione del mutex fallisce, ma non a causa dell'errore 'ERROR_ALREADY_EXISTS' e restituirai un valore errato dalla tua funzione. Per evitare ciò penserei a un hash qui (dopo aver ordinato i parametri). – TLama
Se Application.Title è abbastanza unico, può essere utilizzato al posto di Application.ExeName, poiché è molto più breve e non contiene caratteri '\'. –