12. december 2016 - 17:31
Der er
4 kommentarer og
1 løsning
DELPHI- Find anden printer / DVD ved hjælp af WMI32 CLASS __
HEJ,
Min store maskine har 2 printere tilsluttet (1 netværk og en USB-lokal) og 2 DVD (RW) DREV.
I Delphi finder jeg den ene printer via Windows Class WIN32_Printer .
Ligeledes finder jeg den ene DVD via Windows Class WIN32_CDROMdrive.
Men jeg har (som skrevet) 2 printere og 2 DVD-drev.
Hvordan finder jeg den anden printer og det andet DVD-drev via de 2 class'es ?
Kristian
12. december 2016 - 18:39
#2
HEj
Tak for svar
Her er LIdt af koden:
Koden bruges i første omgang til (også) at lære mig lidt om WMI-klad, så den er nok noget overdreven i denne omgang, men i en senere udganve vil den blive forfinet .
Procedure Tform1.DODVD1();
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_CDROMDrive','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
Listbox2.Items.Add(Format('DVD1: Name %s',[VartoStr(FWbemObject.Name)]));
Listbox2.Items.Add(Format('Caption %s',[VartoStr(FWbemObject.Caption)]));
Listbox2.Items.Add(Format('CompressionMethod %s',[VartoStr(FWbemObject.CompressionMethod)]));
Listbox2.Items.Add(Format('CreationClassName %s',[VartoStr(FWbemObject.CreationClassName)]));
Listbox2.Items.Add(Format('Description %s',[VartoStr(FWbemObject.Description)]));
Listbox2.Items.Add(Format('DeviceID %s',[VartoStr(FWbemObject.DeviceID)]));
Listbox2.Items.Add(Format('Drive %s',[VartoStr(FWbemObject.Drive)]));
Listbox2.Items.Add(Format('ErrorDescription %s',[VartoStr(FWbemObject.ErrorDescription)]));
Listbox2.Items.Add(Format('ErrorMethodology %s',[VartoStr(FWbemObject.ErrorMethodology)]));
Listbox2.Items.Add(Format('Id %s',[VartoStr(FWbemObject.ID)]));
Listbox2.Items.Add(Format('Manufacturer %s',[VartoStr(FWbemObject.Manufacturer)]));
Listbox2.Items.Add(Format('MediaType %s',[VartoStr(FWbemObject.MediaType)]));
Listbox2.Items.Add(Format('MfrAssignedRevisionLevel %s',[VartoStr(FWbemObject.MfrAssignedRevisionLevel)]));
Listbox2.Items.Add(Format('PNPDeviceID %s',[VartoStr(FWbemObject.PNPDeviceID)]));
Listbox2.Items.Add(Format('RevisionLevel %s',[VartoStr(FWbemObject.RevisionLevel)]));
Listbox2.Items.Add(Format('Status %s',[VartoStr(FWbemObject.Status)]));
Listbox2.Items.Add(Format('SystemCreationClassName %s',[VartoStr(FWbemObject.SystemCreationClassName)]));
Listbox2.Items.Add(Format('SystemName %s',[VartoStr(FWbemObject.SystemName)]));
Listbox2.Items.Add(Format('VolumeName %s',[VartoStr(FWbemObject.VolumeName)]));
Listbox2.Items.Add('');
Listbox2.Items.Add(Format('Availability %d',[vartoInt(FWbemObject.Availability)]));
Listbox2.Items.Add(Format('FileSystemFlags %d',[VartoInt(FWbemObject.FileSystemFlags)]));
Listbox2.Items.Add(Format('SCSILogicalUnit %d',[VartoInt(FWbemObject.SCSILogicalUnit)]));
Listbox2.Items.Add(Format('SCSIPort %d',[VartoInt(FWbemObject.SCSIPort)]));
Listbox2.Items.Add(Format('SCSITargetId %d',[VartoInt(FWbemObject.SCSITargetId)]));
Listbox2.Items.Add(Format('StatusInfo %d',[VartoInt(FWbemObject.StatusInfo)]));
Listbox2.Items.Add(Format('ConfigManagerErrorCode %d',[VartoInt(FWbemObject.ConfigManagerErrorCode)]));
Listbox2.Items.Add(Format('FileSystemFlagsEx %d',[VartoInt(FWbemObject.FileSystemFlagsEx)]));
Listbox2.Items.Add(Format('LastErrorCode %d',[VartoInt(FWbemObject.LastErrorCode)]));
Listbox2.Items.Add(Format('MaximumComponentLength %d',[VartoInt(FWbemObject.MaximumComponentLength)]));
Listbox2.Items.Add(Format('NumberOfMediaSupported %d',[VartoInt(FWbemObject.NumberOfMediaSupported)]));
Listbox2.Items.Add(Format('SCSIBus %d',[VartoInt(FWbemObject.SCSIBus)]));
Listbox2.Items.Add(Format('Size %d',[VartoLInt(FWbemObject.Size)]));
Listbox2.Items.Add(Format('DVD1: END %s',['']));
Listbox2.Items.Add('');
FWbemObject := Unassigned;
end;
end;
Og det hele kaldes med:
procedure TForm1.Button1Click(Sender: TObject);
begin
Coinitialize(NIL);
DoDVD1();
COUninitialize;
end;
Det er (som skrevet) ikke alle attributter jeg har brugf for, men i en læreproces føler jeg , at det ikke gør noget at overdrive ganske meget . da det tjener et godt formål (nemlig at lære mig selv det her! )
Koden for LPT1: er stort set den samme som ovenstående bare med attributterne fra WIN32_Printer class'en ,
KR
13. december 2016 - 03:00
#4
Det her virker hos mig:
program wmi;
uses
Windows, SysUtils, ActiveX, ComObj, Variants;
const
wbemFlagForwardOnly = $00000020;
var
SWbemLocator : OLEVariant;
WMIService : OLEVariant;
WbemObjectSet : OLEVariant;
oEnum : IEnumvariant;
WbemObject : OLEVariant;
iValue : LongWord;
begin
Coinitialize(NIL);
SWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WMIService := SWbemLocator.ConnectServer('localhost', 'root\cimv2', '', '');
WbemObjectSet := WMIService.ExecQuery('SELECT * FROM WIN32_Printer','WQL', wbemFlagForwardOnly);
oEnum := IUnknown(WbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, WbemObject, iValue) = 0 do
begin
writeln(VartoStr(WbemObject.Name));
end;
COUninitialize;
end.
Synes godt om
1 synes godt om dette
13. december 2016 - 09:45
#5
Hej,
Tak for koden.
Jeg sammenlignede din kode (omkring LPT1) med min kode og de var stort set ens, bortset fra EET sted nemlig her:
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
IF oEnum.Next(1, FWbemObject, iValue) = 0 then
begin
....
HVis jeg ændrer dette IF THEN til en WHILE ... DO så finder den koden alle printere og alle CD/DVD'ere.
Så problemet er LØST til min store tilfredshed.
1000 Tak. Har markeret din kode i #4 som en løsning.
Kristian
(Min "fejl" lå i at jeg faktisk troede, at der kun var een post i databasen for printere / CD-DVD'ere . Nu er jeg blevet klogere. TAK )