PROGRAM Demo_App_WMI_Design; // #sign:Max: MAXBOX10: 14/05/2017 17:04:06 //#tech:.10perf: 0:0:2.524 threads: 23 192.168.56.1 17:04:07 4.2.5.10 CONST TEXTOUT = 'Hi world of third step code'; var objIE: variant; {TYPE } procedure CreateColorDialog; var mydlg: TColorDialog; begin mydlg:= TColorDialog.Create(self); try mydlg.Execute; finally mydlg.Free; end; end; function ReverseStringX(const s: string): string; var len, ctr: integer; begin len:= length(s); SetLength(result,len); for ctr:= 1 to len do result[len-ctr+1]:= s[ctr]; end; function VariantIsObject(const V: Variant): Boolean; begin Result:= {Variants.}VarIsType(V, varDispatch) or {Variants.}VarIsType(V, varUnknown); end; function WindowSupportsLayersX(const HWnd: {Windows.}HWND): Boolean; //const //WS_EX_LAYERED = $00080000; // layered window style begin Result := IsFlagSet( {Windows.}GetWindowLong(HWnd, {Windows.}GWL_EXSTYLE), WS_EX_LAYERED ); end; function TreeNodeChildCount(ParentNode: TTreeNode): Integer; var ChildNode: {ComCtrls.}TTreeNode; // references each child node begin Result:= 0; if ParentNode = nil then Exit; ChildNode:= ParentNode.GetFirstChild; while (ChildNode <> Nil) do begin Inc(Result); ChildNode:= ChildNode.GetNextSibling; end; end; var isloc: ISWBemLocator; isser: ISWBemServices; iset: ISWbemObjectSet; ENum: IEnumVariant; tempObj: OleVariant; isQuery: string; Begin //@main // for it:= 1 to 2 do Println(TEXTOUT); maXcalcF('Sqrt(PI/e^2)') writeln(ReverseStringX('step')) writeln(ReverseStringX('this is maXbox4 step of code')) writeln(ReverseStringX(ReverseStringX('this is maXbox4 step of code'))) //Object Oriented Call //CreateColorDialog; //CLSIDFromProgID StringToClassID('InternetExplorer.Application'); //ClassIDToString( const ClassID : TCLSID) : string writeln(ClassIDToString(StringToClassID('InternetExplorer.Application'))); writeln('IE Installed: '+botoStr(ProgIDInstalled('InternetExplorer.Application'))) writeln(ClassIDToString(StringToClassID('WbemScripting.SWbemLocator'))); writeln('WMI Installed: '+botoStr(ProgIDInstalled('WbemScripting.SWbemLocator'))) //wmiLocator := CreateOleObject('WbemScripting.SWbemLocator'); //function VariantIsObject(const V: Variant): Boolean; //VariantIsObject(const V: Variant): Boolean; //objIE:= CreateOleObject('InternetExplorer.Application') //writeln('IE Created: '+botoStr(VariantIsObject(objIE))) //objIE:= unassigned; println('Layer Support: '+botoStr(WindowSupportsLayersX(hinstance))) //TreeNodeChildCount //RecycleBinInfo //WindowsProductID //ShowShellPropertiesDlg(exepath) //glVertex3d(0.5, -0.5, 0.5); //Linke Seite //glVertex3d(-0.5, -0.5, 0.5); //StrToFile( const s : string; const FileName : string) : Boolean; if StrToFile('this is the filecontent4 it',exepath+'strtofiletext.txt') then writeln(filetoString(exepath+'strtofiletext.txt')); isloc:= WMIStart; isser:= WMIConnect(isloc, 'maxbox10','max',''); //: ISWBemServices; //GetObject("winmgmts:\\" & strComputer) writeln(WMIGetValue(isser, 'Win32_Service','DisplayName')); writeln(WMIGetValue(isser, 'Win32_Service','State')); writeln(WMIGetValue(isser, 'Win32_Service','StartMode')); writeln(WMIGetValue(isser, 'Win32_LogicalMemoryConfiguration','TotalPhysicalMemory')); writeln(WMIGetValue(isser, 'Win32_LogicalMemoryConfiguration','TotalMemory')); writeln(WMIGetValue(isser, 'Win32_NTLogEvent','ComputerName')); writeln(WMIGetValue(isser, 'Win32_NTLogEvent','User')); writeln(WMIGetValue(isser, 'Win32_NTLogEvent','Logfile')); writeln(WMIGetValue(isser, 'Win32_BIOS','InstallDate')); writeln(WMIGetValue(isser, 'Win32_BIOS','SerialNumber')); iset:= WMIExecQuery(isser, 'SELECT SerialNumber FROM Win32_BIOS'); //WbemObjectSet; writeln(botoStr(WMIRowFindFirst(iset, ENum, tempObj))); writeln(botostr(WMIRowFindNext(ENum, tempObj))); // isQuery:= 'SELECT State FROM Win32_Service WHERE state=Running'; // isQuery:= 'SELECT State,DisplayName,StartMode FROM Win32_Service WHERE State = "Running"'; // isQuery:= 'SELECT * FROM Win32_Service WHERE State = "Running"'; // isQuery:= 'SELECT * FROM Win32_Service'; isQuery:= 'SELECT * FROM Win32_Process'; // isQuery:= 'SELECT Name,DisplayName,State FROM Win32_Service ORDER BY Name'; iset:= WMIExecQuery(isser, isQuery); //WbemObjectSet; writeln(botoStr(WMIRowFindFirst(iset, ENum, tempObj))); it:= 0; repeat //FindNext(ENum, tempobj); writeln('case: '+vartoStr(tempobj.name)+' -- '+vartoStr(tempobj.processid)) inc(it) until not WMIRowFindNext(ENum, tempObj); writeln('Processes : '+itoa(it)) tempObj:= unassigned; //writeln('test first cast: '+vartoStr(tempobj.displayname)) isQuery:= 'SELECT * FROM Win32_Service WHERE State = "Running"'; iset:= WMIExecQuery(isser, isQuery); //WbemObjectSet; writeln(botoStr(WMIRowFindFirst(iset, ENum, tempObj))); repeat //FindNext(ENum,tempobj); writeln('case: '+vartoStr(tempobj.name)+' - '+vartoStr(tempobj.displayname)+ ' -- '+vartoStr(tempobj.state)) until not WMIRowFindNext(ENum, tempobj); //} tempObj:= unassigned; {repeat //WMIRowFindNext(ENum, tempobj); writeln('case: '+vartoStr(tempobj.name)+' - '+vartoStr(tempobj.displayname)+ ' - '+vartoStr(tempobj.state)) WMIRowFindNext(ENum, tempobj); writeln('case: '+vartoStr(tempobj.name)) until not WMIRowFindNext(ENum, tempobj); } //isloc:= unassigned; End. Ref: WMI and Database SQL Programming Starter 12 Tutorial and Tutorial 52 http://www.softwareschule.ch/download/maxbox_starter12.pdf *************** File: C:\maXbox\maXbox4\Examples\705_new_classes_demoapp_wmi.pas function WMIStart: ISWBemLocator; function WMIConnect(WBemLocator: ISWBemLocator; Server, account, password: string): ISWBemServices; function WMIExecQuery(WBemServices: ISWBemServices; query: string): ISWbemObjectSet; function WMIConnect(WBemLocator: ISWBemLocator; Server, account, password: string): ISWBemServices; function WMIExecQuery(WBemServices: ISWBemServices; query: string): ISWbemObjectSet; function WMIRowFindFirst(ObjectSet: ISWbemObjectSet; var ENum: IEnumVariant; var tempobj: OleVariant): boolean; function WMIColFindNext(propENum: IENumVariant; var tempobj: OleVariant): boolean; function WMIGetValue(wbemservices: ISWBemServices; tablename, fieldname: string): string; function WMIConvValue(tempobj: OleVariant; var keyname: string): string; ref VB strComputer = "atl-dc-01" //case: BITS - Background Intelligent Transfer Service -- Running Set wbemServices = GetObject("winmgmts:\\" & strComputer) Set wbemObjectSet = wbemServices.InstancesOf("Win32_Service") For Each wbemObject In wbemObjectSet WScript.Echo "Display Name: " & wbemObject.DisplayName & vbCrLf & _ " State: " & wbemObject.State & vbCrLf & _ " Start Mode: " & wbemObject.StartMode Next Doc: http://www.softwareschule.ch/blix.htm to teach programming for intermediate https://msdn.microsoft.com/en-us/library/aa752044(v=vs.85).aspx function ProgIDInstalled(const PID: string): Boolean; var WPID: WideString; // PID as wide string Dummy: TGUID; // unused out value from CLSIDFromProgID function begin WPID := PID; Result := ActiveX.Succeeded( ActiveX.CLSIDFromProgID(PWideChar(WPID), Dummy) ); end; function ResourceIDToStr(const ResID: PChar): string; begin if IsIntResource(ResID) then Result := '#' + SysUtils.IntToStr(Integer(ResID)) else Result := string(ResID); end; procedure ShowShellPropertiesDlg(const APath: string); var AExecInfo: ShellAPI.TShellExecuteinfo; // info passed to ShellExecuteEx begin FillChar(AExecInfo, SizeOf(AExecInfo), 0); AExecInfo.cbSize := SizeOf(AExecInfo); AExecInfo.lpFile := PChar(APath); AExecInfo.lpVerb := 'properties'; AExecInfo.fMask := ShellAPI.SEE_MASK_INVOKEIDLIST; ShellAPI.ShellExecuteEx(@AExecInfo); end; Ref: http://www.softwareschule.ch/download/maxbox_functions.txt writeln(ReverseString(ReverseString(loadfile(exepath+'firstdemo3.txt')))) Task: try the procedure: procedure ReversePlay(const szFileName: string); //#TODO: try the procedure reversePlay() with a wav file: 2017-05 Cumulative Update for Windows 10 Version 1607 for x64-based Systems (KB4019472) ----File newtemplate.txt not exists - now saved!---- Vorbild: Baureihe V 200.1 der Deutschen Bundesbahn (DB). Modell: Mit Digital-Decoder, Hochleistungsantrieb C-Sinus und Geräuschelektronik. 2 Achsen angetrieben. 4 Haftreifen. Führerstände und Maschinenraum mit Inneneinrichtung. Spitzensignal konventionell in Betrieb, digital schaltbar. Diesellok-Geräusche, Schlusslichter sowie Anfahr- und Bremsverzögerung mit Control Unit 6021 digital schaltbar. Länge über Puffer 21,0 cm. Highlight: Modifizierter Antriebsblock mit C-Sinus-Motor Schwere Metallausführung Detaillierung: Eingesetzte Griffstangen aus Metall Vorbild: Verstärkte V 200 in Ursprungsversion Epoche III Dieselmotor- und Signalgeräusche, digital auch schaltbar keine mfx Version - in Datenbank die Adresse manuell eigeben oder Adresse 22 1975. 24 Carat Purple (2001, EMI, EU, Germany, 724353469221) http://losslessma.net/rock/hard-rock/deep-purple-discography-1968-2014/ ----------------------------------------------------------------------- unit wmiserv; //to maXbox by 4 interface uses comobj, activex, WbemScripting_TLB; const EOAC_NONE = 0; RPC_C_AUTHN_WINNT = 10; RPC_C_AUTHZ_NONE = 0; RPC_E_CHANGED_MODE = -2147417850; function WMIStart: ISWBemLocator; function WMIConnect(WBemLocator: ISWBemLocator; Server, account, password: string): ISWBemServices; function WMIExecQuery(WBemServices: ISWBemServices; query: string): ISWbemObjectSet; function WMIRowFindFirst(ObjectSet: ISWbemObjectSet; var ENum: IEnumVariant; var tempobj: OleVariant): boolean; function WMIRowFindNext(ENum: IENumVariant; var tempobj: OleVariant): boolean; function WMIColFindFirst(var propENum: IENumVariant; var tempObj: OleVariant): boolean; function WMIColFindNext(propENum: IENumVariant; var tempobj: OleVariant): boolean; function WMIGetValue(wbemservices: ISWBemServices; tablename, fieldname: string): string; function WMIConvValue(tempobj: OleVariant; var keyname: string): string; implementation uses sysutils; function WMIStart: ISWBemLocator; // creates the WMI instance along with any error checking var HRes: HResult; begin Result := nil; HRes := CoCreateInstance(Class_SWbemLocator, nil, CLSCTX_INPROC_SERVER, ISWbemLocator, Result); if HRes <> 0 then raise EOleException.Create('Locator instance not created.', 1, '', '', 0); end; function WMIConnect(WBemLocator: ISWBemLocator; Server, account, password: string): ISWBemServices; // connects to a machine for WMI usage. begin Result := nil; try Result := WBEMLocator.ConnectServer(Server, 'root\CIMV2', '', Account, Password, '', 0, nil); except on EOleException do raise EOleException.Create('incorrect credentials. WMI connection failed.', 1, '', '', 0); end; CoSetProxyBlanket(Result, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nil, wbemAuthenticationLevelCall, wbemImpersonationLevelImpersonate, nil, EOAC_NONE); end; function WMIExecQuery(WBemServices: ISWBemServices; query: string): ISWbemObjectSet; // executes a WQL query. begin Result := nil; try Result := WBEmServices.ExecQuery(query, 'WQL', wbemFlagReturnImmediately, nil); except on EOleException do raise EOleException.Create('Invalid statement. Please resubmit.', 1, '', '', 0); end; end; function WMIRowFindFirst(ObjectSet: ISWbemObjectSet; var ENum: IEnumVariant; var tempobj: OleVariant): boolean; // finds the first row in a result set. var Value: Longint; begin Enum := (ObjectSet._NewEnum) as IEnumVariant; Result := (ENum.Next(1, tempObj, @Value) = 0); end; function WMIRowFindNext(ENum: IENumVariant; var tempobj: OleVariant): boolean; // finds the next row in a result set. var Value: Longint; begin Result := (ENum.Next(1, tempObj, @Value) = 0); end; function WMIColFindFirst(var propENum: IENumVariant; var tempObj: OleVariant): boolean; // finds the first column in a row. var Value: Longint; propSet: ISWBemPropertySet; SObject: ISWbemObject; begin SObject := IUnknown(tempObj) as ISWBemObject; propSet := SObject.Properties_; propEnum := (propSet._NewEnum) as IEnumVariant; Result := (propEnum.Next(1, tempObj, @Value) = 0); end; function WMIColFindNext(propENum: IENumVariant; var tempobj: OleVariant): boolean; // finds the next column in a row. var Value: Longint; begin Result := (propENum.Next(1, tempObj, @Value) = 0); end; function WMIGetValue(wbemservices: ISWBemServices; tablename, fieldname: string): string; { this will return the value of the first fieldname that occurs in tablename } var statement: string; RowENum: IENumVariant; ObjectSet: ISWbemObjectSet; tempobj: OleVariant; SObject: ISWbemObject; Sprop: ISWBemProperty; begin Result := ''; statement := 'SELECT ' + fieldname + ' FROM ' + tablename; ObjectSet := WMIExecQuery(WbemServices, statement); if WMIRowFindFirst(ObjectSet, RowENum, tempobj) then begin SObject := IUnknown(tempObj) as ISWBemObject; SProp := SObject.Properties_.Item(fieldname, 0); // specific field property Result := WMIConvValue(SProp, fieldname); end; end; function WMIConvValue(tempobj: OleVariant; var keyname: string): string; { generic WMI value to string conversion of "valuename". Returns the field name into "keyname". Adapted from Denis Blondeau 's SWBEM example. } var Count: Longint; SProp: ISWbemProperty; valuename: string; begin SProp := IUnknown(tempObj) as ISWBemProperty; ValueName := ''; if VarIsNull(SProp.Get_Value) then ValueName := '' else case SProp.CIMType of wbemCimtypeSint8, wbemCimtypeUint8, wbemCimtypeSint16, wbemCimtypeUint16, wbemCimtypeSint32, wbemCimtypeUint32, wbemCimtypeSint64: if VarIsArray(SProp.Get_Value) then begin if VarArrayHighBound(SProp.Get_Value, 1) > 0 then for Count := 1 to VarArrayHighBound(SProp.Get_Value, 1) do ValueName := ValueName + ' ' + IntToStr(SProp.Get_Value[Count]); end else ValueName := IntToStr(SProp.Get_Value); wbemCimtypeReal32, wbemCimtypeReal64: ValueName := FloatToStr(SProp.Get_Value); wbemCimtypeBoolean: if SProp.Get_Value then ValueName := 'True' else ValueName := 'False'; wbemCimtypeString, wbemCimtypeUint64: if VarIsArray(SProp.Get_Value) then begin if VarArrayHighBound(SProp.Get_Value, 1) > 0 then for Count := 1 to VarArrayHighBound(SProp.Get_Value, 1) do ValueName := ValueName + ' ' + SProp.Get_Value[Count]; end else ValueName := SProp.Get_Value; wbemCimtypeDatetime: ValueName := SProp.Get_Value; wbemCimtypeReference: ValueName := SProp.Get_Value; wbemCimtypeChar16: ValueName := '<16-bit character>'; wbemCimtypeObject: ValueName := ''; else ValueName := ''; end; {case} keyname := String(SProp.Name); Result := ValueName; end;