Ver Mensaje Individual
  #9  
Antiguo 13-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Reputación: 26
Caral Va por buen camino
Hola
Una duda que se me presenta:
Usando un codigo que trabaja con un componente he podido hacer que el programa se instale en el startub (inicio) de windows.
Metiéndome (en camisa de once varas) en el msconfig, esta el programa en la ultima paleta (startub).
Es programa lo que usa es la variable (creo que es asi) TRegistry y HKEY_LOCAL_MACHINE.
Pero como dije lo que hace es instalar el programa en el inicio de windows, osea que si algun usuario se loguea, el programa arrancara independientemente del que sea.
Bueno, mi duda:
El ordenador que tengo lo uso de servidor, osea no se loguea nadie.
Cuando arranca simplemente se queda asi y se puede acceder a el desde la red.
Me han dicho que la manera de hacerlo es colocando el programa como un servicio.
Pregunto:
Para colocar el programa como un servicio se puede hacer como con este (TRegistry).?
Se usa el mismo pero de otra manera?
Hay otra forma de hacer que sea servicio?.
Por favor me ayudáis.
Saludos

Este es el componente:
Código Delphi [-]
unit BootExec;

interface 
 
uses 
  Classes,Windows,SysUtils,Registry;
 
type 
  TBootExec = class(TComponent)
 
  Private
     NombreClave : String;
     NombreExec  : String;
     ProximaVez  : Boolean;
     Usuario     : Boolean;
 
  Protected
 
  Public
    constructor Create(AOwner: TComponent); override;
    function AppInReg  : Boolean;
    function AddAppReg : Boolean;
    function DelAppReg : Boolean;
 
  Published
    Property NombrePrograma : string 
             Read NombreClave
             Write NombreClave;
    Property NombreEjecutable : string 
             Read NombreExec
             Write NombreExec;
    Property SoloUnaVez : Boolean
             Read ProximaVez
             Write ProximaVez;
    Property SoloUsuario : Boolean
             Read Usuario
             Write Usuario;
  end; 
 
procedure Register;
 
implementation 
 
{==============================================================================}
constructor TBootExec.Create(AOwner: TComponent);
 
begin 
  Inherited;
  AddAppReg;
end; 
 
{==============================================================================}
function TBootExec.AppInReg : Boolean;
 
var 
  Reg      : TRegistry;
  RegInfo  : TRegDataInfo;
  Clave    : String;
  Valores  : TStringList;
  I        : Integer;
 
begin 
  Result:=False;//No está en el Registro
  Clave:='Software\Microsoft\Windows\CurrentVersion\Run';
  if ProximaVez then Clave := Clave+'Once';
  Reg:=TRegistry.Create;
  if Not(Usuario) then Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Not(Reg.KeyExists(Clave)) Then//comprobar prexistencia de clave
    begin 
       Reg.Free;
       Exit;
    end; 
  Reg.OpenKey(Clave,False);//existe, por tanto podemos abrirla.
  Valores := TStringList.Create;
  Reg.GetValueNames(Valores);//Obtenemos una lista de los Nombres de los valores de la clave
  for I:=0 to (Valores.Count-1) do 
    begin 
      if Reg.GetDataInfo( Valores[i], RegInfo) then 
        begin 
          if (RegInfo.RegData = rdString) then 
            begin 
              if Lowercase(NombreExec)=LowerCase( Reg.ReadString(Valores[i]) ) then 
                begin 
                 Result:=True;
                 Break;
                end; 
            end; 
        end 
       else 
         Valores[i]:='';
    End;//For
  Valores.Free;
  Reg.Free;
end; 
 
{==============================================================================}
function TBootExec.AddAppReg : Boolean;
 
var 
  Reg   : TRegistry;
  Clave : string;
 
begin 
  Result:=False;
  if (NombreClave='') or (NombreExec='') then 
    Exit;
  if AppInReg then 
    Exit;
  Clave:='Software\Microsoft\Windows\CurrentVersion\Run';
  if ProximaVez then Clave := Clave+'Once';
  Reg:=TRegistry.Create;
  if Not(Usuario) then Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Not(Reg.KeyExists(Clave)) then 
    begin 
       Reg.Free;
       Exit;
    end; 
  Reg.OpenKey(Clave,False);
  Reg.WriteString(NombreClave,NombreExec);
  Reg.Free;
  Result:=True;
end; 
 
{==============================================================================}
function TBootExec.DelAppReg : Boolean;
 
var 
  Reg     : TRegistry;
  RegInfo : TRegDataInfo;
  Clave   : string;
  Valores : TStringList;
  I       : integer;
 
begin 
  Result:=False;
  if Not(AppInReg) then 
    Exit;
  if (NombreClave='') or (NombreExec='') then 
    Exit;
  Clave:='Software\Microsoft\Windows\CurrentVersion\Run';
  if ProximaVez then Clave := Clave+'Once';
  Reg:=TRegistry.Create;
  if Not(Usuario) then Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Not(Reg.KeyExists(Clave)) then 
    begin 
       Reg.Free;
       Exit;
    end; 
  Reg.OpenKey(Clave,False);
  Valores := TStringList.Create;
  Reg.GetValueNames(Valores);//Obtenemos una lista de los Nombres de los valores de la clave
  for I:=0 to (Valores.Count-1) do 
    begin 
      if Reg.GetDataInfo( Valores[i], RegInfo) then 
        begin 
          if (RegInfo.RegData = rdString) then 
            begin 
              if Lowercase(NombreExec)=LowerCase( Reg.ReadString(Valores[i]) ) then 
                begin 
                  Reg.DeleteValue( Valores[i] );
                  Result:=True;
                end; 
            end; 
        end; 
    end; 
  Valores.Free;
  Reg.Free;
end; 
 
{==============================================================================}
procedure Register;
 
begin 
  RegisterComponents('LabGalia', [TBootExec]);
end; 
 
{==============================================================================}
END.

Asi grabo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   BootExec1.NombrePrograma:='Programa Hola';
   BootExec1.NombreEjecutable:='C:\Hola\Hola.exe';
   BootExec1.SoloUnaVez:=False;{queremos que se ejecute siempre}
   BootExec1.SoloUsuario:=False;{que se ejecute con cualquier usuario}
if BootExec1.AddAppReg then
   ShowMessage('Ok, se ha instalado correctamente')
  else 
   ShowMessage('NO, Error en la instalación, posiblemente ya esté instalado...');

end;
Y asi lo elimino de windows:
Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
begin
     BootExec1.NombrePrograma:='Programa Hola';
     BootExec1.NombreEjecutable:='C:\Hola\Hola.exe';
     BootExec1.SoloUnaVez:=False;{queremos que se ejecute siempre}
     BootExec1.SoloUsuario:=False;{que se ejecute con cualquier usuario}

if BootExec1.DelAppReg then
   ShowMessage('Ok, se ha Desinstalado correctamente')
  else 
   ShowMessage('NO, Error en la Desinstalación, posiblemente ya fuese desinstalado...'); 
 

end;
Responder Con Cita