|
|
|

| | | | | | | | |  |
 | 
 | Code source : unité LRJ_WinCreateProcess |  |

|  |
 | |  |

|
Description : cette unité contient les objets TWinStartupInfo et TWinCreateProcess.
TWinStartupInfo permet de renseigner les informations utiles aux méthodes CreateProcess.
TWinCreateProcess permet de créer et contrôler des processus.
L'unité est livrée avec une application de démonstration (
voir description plus loin
) qui utilise les fonctionnalités des
objets contenus dans l'unité. Les codes de l'application
sont livrés avec l'unité pour illustrer comment utiliser les méthodes de
cette unité. L'application de démonstration utilise les unités
LRJ_WinRegAppPath et
LRJ_CommandLine
non livrées avec
l'application.
L'unité LRJ_WinCreateProcess met en oeuvre les fonctions de Windows suivantes :
|
|
Closehandle
CreateProcessW
CreateProcessAsUserW
GetExitCodeProcess
ResumeThread
SuspendThread
TerminateProcess
|
Déclarations publiques de l'unité
I
Télécharger l'application de démonstration
I
Exemples d'utilisations
Utilise les unités : Windows, registry et SysUtils
.
Version : 1.0 du 12.07.2009
Auteur : Laurent Hède
Copyright : LorenJo
Nombre de lignes : 613
Réalisée sous : Delphi 6
Systèmes compatibles : NT4, 2000, XP, Vista, serveurs
Prix : 131.00 € H.T.
Déclarations publiques de l'unité :
unit LRJ_WinCreateProcess;
interface
uses
windows,
registry,
SysUtils;
.........
//------------OBJET----------------------------
TWinStartupInfo = class(TObject)
.........
procedure SubtractSetOfTypedStartupInfoFlags(const ASetOfStartupInfoFlags: LRJ_TSetOfStartupInfoFlags);
procedure AddSetOfTypedStartupInfoFlags(const ASetOfStartupInfoFlags: LRJ_TSetOfStartupInfoFlags);
property Flags: DWORD read MOStartupInfo.dwFlags write MOStartupInfo.dwFlags;
property TypedFlags: LRJ_TSetOfStartupInfoFlags read GetTypedFlags write SetTypedFlags;
property DesktopName: string read GetDesktopName write SetDesktopName;
property Title: string read GetTitle write SetTitle;
property X: DWORD read MOStartupInfo.dwX write MOStartupInfo.dwX;
property Y: DWORD read MOStartupInfo.dwY write MOStartupInfo.dwY;
property XSize: DWORD read MOStartupInfo.dwXSize write MOStartupInfo.dwXSize;
property YSize: DWORD read MOStartupInfo.dwYSize write MOStartupInfo.dwYSize;
property XCountChars: DWORD read MOStartupInfo.dwXCountChars write MOStartupInfo.dwXCountChars;
property YCountChars: DWORD read MOStartupInfo.dwYCountChars write MOStartupInfo.dwYCountChars;
property FillAttribute: DWORD read MOStartupInfo.dwFillAttribute write MOStartupInfo.dwFillAttribute;
property ShowWindow: WORD read MOStartupInfo.wShowWindow write MOStartupInfo.wShowWindow;
property StdInput: THandle read MOStartupInfo.hStdInput write MOStartupInfo.hStdInput;
property StdOutput: THandle read MOStartupInfo.hStdOutput write MOStartupInfo.hStdOutput;
property StdError: THandle read MOStartupInfo.hStdError write MOStartupInfo.hStdError;
end;//-----------FIN--------------------------
//------------OBJET----------------------------
TWinCreateProcess = class(TObject)
.........
function IsOpen: boolean;
function CreateProcess(const WaitTime: Integer = 5000): boolean; // si TokenUser = 0, createProcess simple, sinon, CreateProcesAsUser
function Terminate: boolean;
function Suspend: boolean;
function Resume: boolean;
function Restart: boolean; // Terminate + CreateProcess
procedure AddSetOfTypedCreationFlags(const ASetOfTypedCreationFlags: LRJ_TSetOfProcessCreationFlags); // Ajoute à CreationFlags
// la valeur des types passés en paramètre
procedure SubtractSetOfTypedCreationFlags(const ASetOfTypedCreationFlags: LRJ_TSetOfProcessCreationFlags); // Retire à CreationFlags
// la valeur des types passés en paramètre
property CreationFlags: DWORD read MOCreationFlags write MOCreationFlags; //CreationFlags sous la forme standard
property TypedCreationFlags: LRJ_TSetOfProcessCreationFlags read GetSetOfTypedCreationFlags write SetSetOfTypedCreationFlags; //CreationFlags
// sous une forme typée. Lorsqu'on attribut TypedCreationFlags, CreationFlags devient la valeur
// du set attribué indépendamment de sa valeur antérieure (CreationFlags est remis à zéro avant
// que le set soit ajouté).
property ProcessHandle: THandle read MOProcessInfo.hProcess;
property ThreadHandle: THandle read MOProcessInfo.hThread;
property ProcessID: DWORD read MOProcessInfo.dwProcessId;
property ThreadID: DWORD read MOProcessInfo.dwThreadId;
property FullFileName: string read MOApplicName Write SetFullFileName;
property Directory: string read MODirectory Write SetDirectory;
property CommandLine: string read MOCommandLine write SetCommandLine;
property InheritedHandles: boolean read MOInheritedHandles write SetInheritedHandles;
property Environment: pointer read MOEnvironnement write SetEnvironment;
property TokenUser: THandle read MOTokenUser write SetTokenUser;
property SecurityDescriptorProcess: pointer read GetSecurityDescriptorProcess write SetSecurityDescriptorProcess;
property SecurityDescriptorProcessInheritable: boolean read GetSecurityDescriptorProcessInheritable write SetSecurityDescriptorProcessInheritable;
property SecurityDescriptorThread: pointer read GetSecurityDescriptorThread write SetSecurityDescriptorThread;
property SecurityDescriptorThreadInheritable: boolean read GetSecurityDescriptorThreadInheritable write SetSecurityDescriptorThreadInheritable;
property StartupInfoObject: TWinStartupInfo read MOStartupInfo;
property LastError: DWORD read MOLastError;
end;//-----------FIN--------------------------
|
Application de démonstration

Le champs "Nom de l'application" sert à saisir le chemin complet de l'application et
"Ligne de commande" la ligne de commande associée à l'application.
Le bouton "Lancer l'application saisie" permet de lancer l'application
des valeurs saisies dans les boîtes d'édition.
Le bouton "Lancer une application de la liste" ouvre un PopUpMenu dans lequel
on retrouve les applications référencés dans le système que l'on peut lancer en
cliquant sur l'item du PopUpMenu.
Le nom complet et la ligne de commande renseignés pour l'objet TWinCreateProcess
passe par les fonction d'optimisation LRJ_GetApplicName et LRJ_GetCmdLine de
l'unité
LRJ_CommandLine
.
Exemples d'utilisations
Codes de l'application de démo.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls,
LRJ_WinRegAppPath,
LRJ_CommandLine,
LRJ_WinCreateProcess;
type
TSpecMenuItem = class(TMenuItem)
private
MOApplicName: string;
MOIcon: TIcon;
procedure Int_OnMeasureItem(Sender: TObject;ACanvas: TCanvas; var Width, Height: Integer);
procedure Int_OnDrawItem(Sender: TObject;ACanvas:TCanvas; ARect: TRect; Selected: Boolean);
public
procedure AfterConstruction; override;
destructor destroy; override;
end;
TForm1 = class(TForm)
Button1: TButton;
PopupMenu1: TPopupMenu;
Button2: TButton;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure ChargeMenu;
procedure OnClickItem(sender: TObject);
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{--------------------------------------------------------------}
procedure TForm1.OnClickItem(sender: TObject);
var
zCreatedProcess: TWinCreateProcess;
begin
zCreatedProcess := TWinCreateProcess.Create;
zCreatedProcess.FullFileName := LRJ_GetApplicName('',TSpecMenuItem(sender).MOApplicName);
zCreatedProcess.CommandLine := LRJ_GetCmdLine('',TSpecMenuItem(sender).MOApplicName);
zCreatedProcess.CreateProcess;
zCreatedProcess.Free;
end;
{--------------------------------------------------------------}
procedure TForm1.ChargeMenu;
var
zListApplic: LrJ_TWRegAppPathsList;
zItem: LrJ_TWRegAppPathsItem;
zMenuItem: TSpecMenuItem;
i: integer;
zExt: string;
begin
zListApplic := LrJ_TWRegAppPathsList.Create;
for i:=0 to zListApplic.Count -1 do
begin
zItem := zListApplic.Items[i];
if assigned(zItem) then
begin
zExt := ExtractFileExt(zItem.ApplicName);
if compareText(zExt, '.exe') = 0 then
if FileExists(zItem.FileName) then
begin
zMenuItem := TSpecMenuItem.Create(PopupMenu1);
zMenuItem.MOIcon.Handle := zItem.GetSmallIcon;
zMenuItem.Caption := zItem.ApplicName;
zMenuItem.MOApplicName := zItem.FileName;
zMenuItem.OnClick := OnClickItem;
PopupMenu1.items.Add(zMenuItem);
end;
end;
end;
PopupMenu1.OwnerDraw := true;
PopupMenu1.AutoHotkeys := maManual;
zListApplic.Free;
end;
{--------------------------------------------------------------}
procedure TSpecMenuItem.AfterConstruction;
begin
inherited;
MOIcon := TIcon.Create;
OnMeasureItem := Int_OnMeasureItem;
OnDrawItem := Int_OnDrawItem;
end;
{--------------------------------------------------------------}
procedure TSpecMenuItem.Int_OnDrawItem(Sender: TObject;ACanvas:TCanvas; ARect: TRect; Selected: Boolean);
begin
ACanvas.Draw(ARect.Left+1,ARect.Top+1, TIcon(MOIcon));
ACanvas.TextOut(ARect.Left + 20, ARect.Top + 2, caption);
end;
{--------------------------------------------------------------}
procedure TSpecMenuItem.Int_OnMeasureItem(Sender: TObject;ACanvas: TCanvas; var Width, Height: Integer);
begin
width := 22 + ACanvas.TextWidth(caption)
end;
{--------------------------------------------------------------}
destructor TSpecMenuItem.destroy;
begin
MOIcon.Free;
inherited;
end;
{--------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
ChargeMenu;
end;
{--------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
zPoint: TPoint;
begin
if PopupMenu1.Items.Count = 0 then ChargeMenu;
zPoint.X := form1.ClientRect.Left + Button1.Left + Button1.Width;
zPoint.Y := form1.ClientRect.top + Button1.top + Button1.height;
zPoint := form1.ClientToScreen(zPoint);
PopupMenu1.Popup(zPoint.X, zPoint.y);
end;
{--------------------------------------------------------------}
procedure TForm1.Button2Click(Sender: TObject);
var
zCreatedProcess: TWinCreateProcess;
begin
zCreatedProcess := TWinCreateProcess.Create;
zCreatedProcess.FullFileName := LRJ_GetApplicName(edit1.Text,edit2.Text);
zCreatedProcess.CommandLine := LRJ_GetCmdLine(edit1.Text,edit2.Text);
zCreatedProcess.CreateProcess;
zCreatedProcess.Free;
end;
{--------------------------------------------------------------}
end.
|
Vous n'avez pas trouvé d'exemple répondant à votre problématique ?
Cliquez sur ce lien.
|
|
 |
 | |  |
|
|