furax13
Messages postés90Date d'inscriptionmardi 28 octobre 2003StatutMembreDernière intervention24 avril 2008 19 janv. 2005 à 08:33
J'ai fait un petit programme de surveillance :
- le programme se met dans la base de registre et est lancé à chaque démarrage du PC quelque soit l'utilisateur
- le programme se met dans la barre des tâches et l'IHM est caché.
- je crée un fichier de log
- je lance l'exe à surveiller et je le redémarre dès qu'il s'arrête.
Unit du programme de surveillance :
unit MainSurv;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
Registry,
Hotlog {composant de gestion de traces trouvé sur le net };
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure TForm1.FormCreate(Sender: TObject);
var
//Ecriture dans la base de registre
Reg: TRegistry;
ProgramPath: string;
nomFichierCourant: string;
//Gestion de l'application en mode surveillance-relance
StartInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Fin: Boolean;
// Fichier pour la Gestion des logs pour la non-régression
LogNR: THotLog;
begin
//Lancement automatique de mon appli dans la base de registre au démarrage de Windows
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE; // A l'ouverture d'une session de chaque utilisateurs
if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False) then
WriteString('SurvRecuit.exe', Application.exename);
end;
finally
Reg.Free;
end;
//Paramétrage du fichier de log pour la non régression
LogNR := THotLog.create;
// Récupére le path complet du programme
ProgramPath := ExtractFilePath(Application.exename);
nomFichierCourant := ProgramPath + 'SurvRecuit.log';
//A chaque redemarrage du surveillant, on supprime l'ancien fichier de log.
if FileExists(nomFichierCourant) then
DeleteFile(nomFichierCourant);
// Nom du fichier de log
LogNR.hlWriter.hlFileDef.ddname := 'SurvRecuit';
// Démarrage de l'écriture dans le fichier de log des non-régression ;
LogNR.StartLogging;
LogNR.add('/***********************************************************/');
// Both date and time, space separator (yyyy-mm-dd hh:mm:ss)
LogNR.add('Date de lancement de l application : {now}');
// The name of the programm
LogNR.add('Nom de l exécutable : {app_name}');
// The path of the programm
LogNR.add('Répertoire de l application: {app_path}');
LogNR.add('/***********************************************************/');
{ Mise à zéro de la structure StartInfo }
FillChar(StartInfo, SizeOf(StartInfo), #0);
{ Seule la taille est renseignée, toutes les autres options }
{ laissées à zéro prendront les valeurs par défaut }
StartInfo.cb := SizeOf(StartInfo);
//On cache l'application de la barre des tâches
ShowWindow(Application.Handle, SW_HIDE);
{ Lancement de la ligne de commande }
if CreateProcess(nil, '"C:\csv3\ExtractCsv.exe"', nil, nil, False,
0, nil, nil, StartInfo, ProcessInfo) then
begin
{ L'application est bien lancée, on va en attendre la fin }
{ ProcessInfo.hProcess contient le handle du process principal de l'application }
Fin := False;
repeat
{ On attend la fin de l'application }
case WaitForSingleObject(ProcessInfo.hProcess, 200) of
WAIT_OBJECT_0:
begin
LogNR.add('Application terminée. On la relance. {now}');
//trace de relance
LogNR.add('Application Relancée. {now}');
end;
WAIT_TIMEOUT: ; { elle n'est pas terminée, on continue d'attendre }
end;
{ Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée. }
Application.ProcessMessages;
until Fin;
//On stoppe la gestion des traces
LogNR.free;
end
else
RaiseLastOSError;
end;
end.
L'application à surveiller se nomme : C:\csv3\ExtractCsv.exe.
dans le main de l'unit de ExtractCsv.exe, j'ai rajouté le code suivant :
SetLastError(NO_ERROR);
CreateMutex (nil, False, 'Nom de l application');
if GetLastError = ERROR_ALREADY_EXISTS
then Exit;
cela permet de ne lancer l'application qu'une seule fois.