Lenguaje de programación Borland Delphi
Con esta función podremos obtener los servicios instalados en un PC, nos mostrará tanto el nombre interno como el externo del servicio. Para ello necesitaremos un Formulario (TForm) y dentro de éste un Memo (TMemo). En el evento "Create" del formulario coloraremos la llamada a la función que obtiene los servicios instalados y los mostrará en el Memo. La función utilizada se basa en la API de Windows, con lo cual necesitaremos colocar en el USES de la unidad una llamada a "winsvc":
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, winsvc;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const
// tipos de servicios
SERVICE_KERNEL_DRIVER = $00000001;
SERVICE_FILE_SYSTEM_DRIVER = $00000002;
SERVICE_ADAPTER = $00000004;
SERVICE_RECOGNIZER_DRIVER = $00000008;
SERVICE_DRIVER =
(SERVICE_KERNEL_DRIVER or
SERVICE_FILE_SYSTEM_DRIVER or
SERVICE_RECOGNIZER_DRIVER);
SERVICE_WIN32_OWN_PROCESS = $00000010;
SERVICE_WIN32_SHARE_PROCESS = $00000020;
SERVICE_WIN32 =
(SERVICE_WIN32_OWN_PROCESS or
SERVICE_WIN32_SHARE_PROCESS);
SERVICE_INTERACTIVE_PROCESS = $00000100;
SERVICE_TYPE_ALL =
(SERVICE_WIN32 or
SERVICE_ADAPTER or
SERVICE_DRIVER or
SERVICE_INTERACTIVE_PROCESS);
{$R *.dfm}
// obtener una lista de los servicios instalados
// Tipo de servicio
// SERVICE_WIN32,
// SERVICE_DRIVER or
// SERVICE_TYPE_ALL
// estado del servicio
// SERVICE_ACTIVE,
// SERVICE_INACTIVE or
// SERVICE_STATE_ALL
function obtenerServicios(sPC : string; dwServiceType, dwServiceState : DWord;
slServicesList : TStrings) : boolean;
const
cnMaxServices = 4096;
type
TSvcA = array[0..cnMaxServices] of TEnumServiceStatus;
PSvcA = ^TSvcA;
var
j : integer;
schm : SC_Handle;
nBytesNeeded, nServices, nResumeHandle : DWord;
ssa : PSvcA;
begin
Result := false;
schm := OpenSCManager(PChar(sPC), Nil, SC_MANAGER_ALL_ACCESS);
if (schm > 0) then
begin
nResumeHandle := 0;
New(ssa);
EnumServicesStatus(schm, dwServiceType, dwServiceState, ssa^[0], SizeOf(ssa^),
nBytesNeeded, nServices, nResumeHandle );
for j := 0 to nServices - 1 do
begin
//slServicesList.Add(StrPas(ssa^[j].lpDisplayName));
slServicesList.Add(StrPas(ssa^[j].lpDisplayName) + ' [' + StrPas(ssa^[j].lpServiceName) + ']');
end;
Result := true;
Dispose(ssa);
CloseServiceHandle(schm);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
obtenerServicios('', SERVICE_WIN32, SERVICE_STATE_ALL, Memo1.Lines)
end;
end.
Publicado el: 2005-01-30