Ver Mensaje Individual
  #2  
Antiguo 11-11-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
camiz,

Cita:
Empezado por camiz
...este código...al ejecutarse la aplicación crea un proceso repetitivo...ejecutándose infinidad de veces...
Te comento: El código señalado en el Msg #1 no controla el número de instancias de una aplicación, solo permite ejecutar la misma con privilegios de administrador en Windows.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  CurrentSemafor : THandle;

implementation

{$R *.dfm}

// Ejecuta una aplicación con derechos de administrador en Windows
procedure RunAsAdmin(const ProgramName: String; const Parameters: String = ''; Handle : HWND = 0);
var
   Info : TShellExecuteInfo;

begin

   FillChar(Info, SizeOf(Info), 0);

   Info.cbSize := SizeOf(Info);
   Info.Wnd := Handle;
   Info.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
   Info.lpVerb := 'runas'; // Eleva los privilegios de ejecución a Administrador
   Info.lpFile := PChar(ProgramName);
   Info.lpParameters := PChar(Parameters);
   Info.nShow := SW_SHOWNORMAL;

   if not ShellExecuteEx(@Info) then
      RaiseLastOSError;

end;

// Verifica si esta activa una instancia de la aplicación por medio de un Semáforo de Control
function CheckInstance(AppName : String) : Boolean;
var
   Semafor : THandle;
begin

   Semafor := CreateSemaphore(nil, 0, 1, PChar(AppName));
   if (Semafor <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
   begin
      CloseHandle(Semafor);
      Result := False;
      Exit;
   end
   else
   begin
      CurrentSemafor := Semafor;
      Result := True;
   end;

end;

// Ejecuta una sola instancia de la aplicación con derechos de administrador por medio de un Semáforo de Control
procedure TForm1.Button1Click(Sender: TObject);
begin
   if CheckInstance('Calc') then
      RunAsAdmin('Calc.exe')
   else
      MessageDlg('La Aplicación ya esta Activa en Memoria',mtInformation,[mbOK],0)
end;

// Libera el Semáforo de Control para Permitir otra Instancia de la Aplicación
procedure TForm1.Button2Click(Sender: TObject);
begin
   CloseHandle(CurrentSemafor);
end;

end.
El código anterior permite ejecutar una única instancia de una aplicación con derechos de administrador en Windows mientras este activo un semáforo de control definido por medio de un string que identifica a la misma.

Revisa estos links:
Cita:
1- Evitar múltiples instancias de nuestra aplicación : http://clubdelphi.com/foros/showthread.php?t=80901

2- Controlling the number of application instances : http://delphi.about.com/od/windowssh.../aa100703a.htm

3- TInstanceControl : http://delphi.about.com/library/weekly/aa110203a.htm

4- CreateSemaphore function : http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 11-11-2013 a las 04:38:12.
Responder Con Cita