Update : to get last version check the new page of this project
Many new features was added to the application
The tool allows you compile and run the generated code directly without leaving the application
check the screen to select the installed Delphi compiler to use.
and the compiler result output
Added support for call WMI methods
Check the generated code for the Win32_Process wmi class and the Create method.
//------------------------------------------------------------------------------ // This code was generated by the Wmi Delphi Code Creator https://theroadtodelphi.wordpress.com // Version: 1.0.0.11 // // // // LIABILITY DISCLAIMER // THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. // YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS, // DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE. // // //------------------------------------------------------------------------------ program GetWMI_Info; {$APPTYPE CONSOLE} uses SysUtils, ActiveX, ComObj, Variants; function VarArrayToStr(const vArray: variant): string; function _VarToStr(const V: variant): string; var Vt: integer; begin Vt := VarType(V); case Vt of varSmallint, varInteger : Result := IntToStr(integer(V)); varSingle, varDouble, varCurrency : Result := FloatToStr(Double(V)); varDate : Result := VarToStr(V); varOleStr : Result := WideString(V); varBoolean : Result := VarToStr(V); varVariant : Result := VarToStr(Variant(V)); varByte : Result := char(byte(V)); varString : Result := String(V); varArray : Result := VarArrayToStr(Variant(V)); end; end; var i : integer; begin Result := '['; if (VarType(vArray) and VarArray)=0 then Result := _VarToStr(vArray) else for i := VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do if i=VarArrayLowBound(vArray, 1) then Result := Result+_VarToStr(vArray[i]) else Result := Result+'|'+_VarToStr(vArray[i]); Result:=Result+']'; end; function VarStrNull(const V:OleVariant):string; //avoid problems with null strings begin Result:=''; if not VarIsNull(V) then begin if VarIsArray(V) then Result:=VarArrayToStr(V) else Result:=VarToStr(V); end; end; function GetWMIObject(const objectName: String): IDispatch; //create the Wmi instance var chEaten: Integer; BindCtx: IBindCtx; Moniker: IMoniker; begin OleCheck(CreateBindCtx(0, bindCtx)); OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); end; //The Create method creates a new process. //The method returns an integer value //that can be interpretted as follows: //0 - Successful completion. //2 - The user //does not have access to the requested information. //3 - The user does not have //sufficient privilge. //8 - Unknown failure. //9 - The path specified does not //exist. //21 - The specified parameter is invalid. //Other - For integer values //other than those listed above, refer to Win32 error code documentation. procedure Invoke_Win32_Process_Create; var objWMIService : OLEVariant; objInvoker : OLEVariant; objInParams : OLEVariant; objOutParams : OLEVariant; begin objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s',['.','root\CIMV2'])); objInvoker := objWMIService.Get('Win32_Process'); objInParams := objInvoker.Methods_.Item('Create').InParameters.SpawnInstance_(); objInParams.CommandLine:='notepad.exe'; objOutParams := objWMIService.ExecMethod('Win32_Process', 'Create', objInParams); Writeln('ProcessId '+VarStrNull(objOutParams.ProcessId)); Writeln('ReturnValue '+VarStrNull(objOutParams.ReturnValue)); end; begin try CoInitialize(nil); try Invoke_Win32_Process_Create; Readln; finally CoUninitialize; end; except on E:Exception do begin Writeln(E.Classname, ':', E.Message); Readln; end; end; end.
Check the generated code for the __InstanceCreationEvent Event using as traget instance the Win32_Process class, this sample code check when new process is launched in the whole system.
//------------------------------------------------------------------------------ // This code was generated by the Wmi Delphi Code Creator https://theroadtodelphi.wordpress.com // Version: 1.0.0.11 // // // // LIABILITY DISCLAIMER // THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. // YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS, // DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE. // // //------------------------------------------------------------------------------ program GetWMI_Info; {$APPTYPE CONSOLE} uses Windows, SysUtils, ActiveX, ComObj, Variants; function VarArrayToStr(const vArray: variant): string; function _VarToStr(const V: variant): string; var Vt: integer; begin Vt := VarType(V); case Vt of varSmallint, varInteger : Result := IntToStr(integer(V)); varSingle, varDouble, varCurrency : Result := FloatToStr(Double(V)); varDate : Result := VarToStr(V); varOleStr : Result := WideString(V); varBoolean : Result := VarToStr(V); varVariant : Result := VarToStr(Variant(V)); varByte : Result := char(byte(V)); varString : Result := String(V); varArray : Result := VarArrayToStr(Variant(V)); end; end; var i : integer; begin Result := '['; if (VarType(vArray) and VarArray)=0 then Result := _VarToStr(vArray) else for i := VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do if i=VarArrayLowBound(vArray, 1) then Result := Result+_VarToStr(vArray[i]) else Result := Result+'|'+_VarToStr(vArray[i]); Result:=Result+']'; end; function VarStrNull(const V:OleVariant):string; //avoid problems with null strings begin Result:=''; if not VarIsNull(V) then begin if VarIsArray(V) then Result:=VarArrayToStr(V) else Result:=VarToStr(V); end; end; function GetWMIObject(const objectName: String): IDispatch; //create the Wmi instance var chEaten: Integer; BindCtx: IBindCtx; Moniker: IMoniker; begin OleCheck(CreateBindCtx(0, bindCtx)); OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); end; function KeyPressed:boolean; //Detect if an key is pressed var NumEvents : DWORD; ir : _INPUT_RECORD; bufcount : DWORD; StdIn : THandle; begin Result:=false; StdIn := GetStdHandle(STD_INPUT_HANDLE); NumEvents:=0; GetNumberOfConsoleInputEvents(StdIn,NumEvents); if NumEvents<> 0 then begin PeekConsoleInput(StdIn,ir,1,bufcount); if bufcount <> 0 then begin if ir.EventType = KEY_EVENT then begin if ir.Event.KeyEvent.bKeyDown then result:=true else FlushConsoleInputBuffer(StdIn); end else FlushConsoleInputBuffer(StdIn); end; end; end; Procedure Event___InstanceCreationEvent_Target_Win32_Process; var objWMIService : OLEVariant; objEvent : OLEVariant; objResult : OLEVariant; begin objWMIService := GetWMIObject('winmgmts:\\.\root\CIMV2'); objEvent := objWMIService.ExecNotificationQuery('Select * from __InstanceCreationEvent Within 1 Where TargetInstance ISA ''Win32_Process'' '); while not KeyPressed do begin try objResult := objEvent.NextEvent(100); except on E:EOleException do if EOleException(E).ErrorCode=HRESULT($80043001) then //Check for the timeout error wbemErrTimedOut 0x80043001 objResult:=Null else raise; end; if not VarIsNull(objResult) then begin Writeln('Caption '+VarStrNull(objResult.TargetInstance.Caption)); Writeln('CommandLine '+VarStrNull(objResult.TargetInstance.CommandLine)); Writeln('CreationClassName '+VarStrNull(objResult.TargetInstance.CreationClassName)); Writeln('CreationDate '+VarStrNull(objResult.TargetInstance.CreationDate)); Writeln('CSCreationClassName '+VarStrNull(objResult.TargetInstance.CSCreationClassName)); Writeln('CSName '+VarStrNull(objResult.TargetInstance.CSName)); Writeln('Description '+VarStrNull(objResult.TargetInstance.Description)); Writeln('ExecutablePath '+VarStrNull(objResult.TargetInstance.ExecutablePath)); Writeln('ExecutionState '+VarStrNull(objResult.TargetInstance.ExecutionState)); Writeln('Handle '+VarStrNull(objResult.TargetInstance.Handle)); Writeln('HandleCount '+VarStrNull(objResult.TargetInstance.HandleCount)); Writeln('InstallDate '+VarStrNull(objResult.TargetInstance.InstallDate)); Writeln('KernelModeTime '+VarStrNull(objResult.TargetInstance.KernelModeTime)); Writeln('MaximumWorkingSetSize '+VarStrNull(objResult.TargetInstance.MaximumWorkingSetSize)); Writeln('MinimumWorkingSetSize '+VarStrNull(objResult.TargetInstance.MinimumWorkingSetSize)); Writeln('Name '+VarStrNull(objResult.TargetInstance.Name)); Writeln('OSCreationClassName '+VarStrNull(objResult.TargetInstance.OSCreationClassName)); Writeln('OSName '+VarStrNull(objResult.TargetInstance.OSName)); Writeln('OtherOperationCount '+VarStrNull(objResult.TargetInstance.OtherOperationCount)); Writeln('OtherTransferCount '+VarStrNull(objResult.TargetInstance.OtherTransferCount)); Writeln('PageFaults '+VarStrNull(objResult.TargetInstance.PageFaults)); Writeln('PageFileUsage '+VarStrNull(objResult.TargetInstance.PageFileUsage)); Writeln('ParentProcessId '+VarStrNull(objResult.TargetInstance.ParentProcessId)); Writeln('PeakPageFileUsage '+VarStrNull(objResult.TargetInstance.PeakPageFileUsage)); Writeln('PeakVirtualSize '+VarStrNull(objResult.TargetInstance.PeakVirtualSize)); Writeln('PeakWorkingSetSize '+VarStrNull(objResult.TargetInstance.PeakWorkingSetSize)); Writeln('Priority '+VarStrNull(objResult.TargetInstance.Priority)); Writeln('PrivatePageCount '+VarStrNull(objResult.TargetInstance.PrivatePageCount)); Writeln('ProcessId '+VarStrNull(objResult.TargetInstance.ProcessId)); Writeln('QuotaNonPagedPoolUsage '+VarStrNull(objResult.TargetInstance.QuotaNonPagedPoolUsage)); Writeln('QuotaPagedPoolUsage '+VarStrNull(objResult.TargetInstance.QuotaPagedPoolUsage)); Writeln('QuotaPeakNonPagedPoolUsage'+VarStrNull(objResult.TargetInstance.QuotaPeakNonPagedPoolUsage)); Writeln('QuotaPeakPagedPoolUsage '+VarStrNull(objResult.TargetInstance.QuotaPeakPagedPoolUsage)); Writeln('ReadOperationCount '+VarStrNull(objResult.TargetInstance.ReadOperationCount)); Writeln('ReadTransferCount '+VarStrNull(objResult.TargetInstance.ReadTransferCount)); Writeln('SessionId '+VarStrNull(objResult.TargetInstance.SessionId)); Writeln('Status '+VarStrNull(objResult.TargetInstance.Status)); Writeln('TerminationDate '+VarStrNull(objResult.TargetInstance.TerminationDate)); Writeln('ThreadCount '+VarStrNull(objResult.TargetInstance.ThreadCount)); Writeln('UserModeTime '+VarStrNull(objResult.TargetInstance.UserModeTime)); Writeln('VirtualSize '+VarStrNull(objResult.TargetInstance.VirtualSize)); Writeln('WindowsVersion '+VarStrNull(objResult.TargetInstance.WindowsVersion)); Writeln('WorkingSetSize '+VarStrNull(objResult.TargetInstance.WorkingSetSize)); Writeln('WriteOperationCount '+VarStrNull(objResult.TargetInstance.WriteOperationCount)); Writeln('WriteTransferCount '+VarStrNull(objResult.TargetInstance.WriteTransferCount)); Writeln(''); end; end; end; begin try CoInitialize(nil); try Event___InstanceCreationEvent_Target_Win32_Process; Readln; finally CoUninitialize; end; except on E:Exception do begin Writeln(E.Classname, ':', E.Message); Readln; end; end; end.
Improved WMi explorer window
this option now shows more info about the wmi classes, including the properties types, methods parameters (in, out)
also includes an option to view the values of the properties of the selected WMI class
and finally a new option called Search WMI Database, this option lets you search in all the wmi classes for a particular word.
see this sample image looking for the Motherboard word
October 26, 2010 at 7:53 am
Hola Rodrigo.
Veo que sigues mejorando la aplicación. me alegro. Realmente se va a convertir en algo imprescindible para trabajar con WMI y Delphi.
Como sugerencias, sino te importa te comentaría que:
* Sigas manteniendo la versión portable (ZIP con el EXE) si es posible. A muchos de nosotros nos sigue gustando instalar (vía instalador) lo menos posible en Windows.
* Para las Classes (en la pantalla Principal/Code Generation) estaría bien poder disponer de alguna búsqueda rápida; Por ejemplo, para root/CIMV2 hay más de 900 clases y buscarlas en el desplegable es “poco cómodo”.
* Tal vez utilizaría un poco más los ToolTips.
* La posible traducción de la aplicación a varios idiomas también sería una mejora considerable. Es posible que en este caso la gente te ayude, sino siempre estará Google. ;-)
No quiero hacerme tampoco muy pesado. Felicidades de nuevo por ell programa.
Un saludo.
October 26, 2010 at 8:04 am
Gracias por tus comentarios Neftali, muchas de las sugerencias que tu mencionas ya lo tengo en mente, para incluirlo en nuevas versiones (esta es solo la segunda version), sobre todo el tema de traducir la aplicacion. a lo mejor los amigos del club delphi nos podrian ayudar con eso ;).
October 26, 2010 at 9:02 am
This is very well done. This is the kind add-on that should be built into the Delphi IDE. Thank you for your time and contribution!!
October 27, 2010 at 4:16 am
Thanks Mick for your comments.
October 27, 2010 at 4:57 am
Thank you! Great update in compare to the initial release.
October 27, 2010 at 5:07 am
Just one thing; the installer does not as for destination folder, and does not create any icon in Start Menu, so user has to search for the app and find it himself.
October 27, 2010 at 10:20 pm
Thanks for your comments and suggestions.
October 31, 2010 at 5:50 pm
Saludos,
He intentado usar tu generador de código, pero me arroja un error en esta línea al compilar.
objOutParams := objWMIService.ExecMethod(‘Win32_WindowsProductActivation’, ‘SetProductKey’, objInParams);
November 1, 2010 at 12:36 pm
Hola Maxium, enviame el codigo completo generado por la aplicacion para revisarlo, incluyendo la clase wmi que usaste , el error que te aparece y la version de delphi que usas.
mi correo es
rodrigo dot ruz dot v at gmail dot com
November 20, 2010 at 8:57 pm
Really nice work!
Comes in handy :-)