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
Avatar billede arne_v Ekspert
12. december 2016 - 17:47 #1
Normal faar man ved WMI adgang til alle enheder af en bestemt type saa man bare skal have en loekke der henter dem en af gangen.

Saa maa vi se lidt kode?
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
Avatar billede arne_v Ekspert
12. december 2016 - 20:43 #3
Hmmm. Der er jo en while loekke.

Jeg bliver vist noedt til at proeve selv.
Avatar billede arne_v Ekspert
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.
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 )
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester