Entwickler-Ecke

Windows API - Aktive Drucker am USB BUS ermitteln


ruewue - Fr 30.10.15 11:43
Titel: Aktive Drucker am USB BUS ermitteln
Hallo zusammen,

ich hoffe nach langer Zeit das ich hier richtig bin.

Ich habe ein Problem mit der Kommunikation am USB. Ich muss den Device Path ("\\?\usb#vid_xxxx&pid_xxxx#111072559932#{a5dcbf10-6530-11d2-901f-00c04fb951ed}") eines USB Druckers beim Programmstart ermitteln. Beim an- und abstecken des Druckers (auch ein- und ausschalten) während das Progam läuft kein Problem. Aber wenn der Drucker an ist und dann das Programm gestartet wird, dann komme ich nicht an die Info da keine TMessage vom System gesandt wird. Ich brauche diesen Device Path um direkt mit dem Drucker zu Kommunisieren ohne über den Druckertreiber zu gehen. Diese Kommunikation klappt sehr gut, jedoch muss ich immer den Device Path mit dem "USB Device tree viewer" ermitteln und dann von Hand eintragen. Das wäre auch kein Problem, wenn die Drucker nicht immer wieder ausgetauscht werden würden, sind so 50 PC's und Drucker. Der Druck über den Druckertreiber bleibt hierbei aussenvor.

Hat jemand schon mal soetwas gemacht? Ich brauche nur den Device Path vom aktiven USB Drucker und nicht alle USB Geräte. Es ist auch nur ein Drucker am USB dran.

Ich wäre für einen Denkanstoss sehr Dankbar. Vieleicht hat ja auch jemand genau hierfür schon mal eine Lösung gefunden.

Gruß Rüdiger


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 30.10.2015 um 12:13


Holgerx - Sa 31.10.15 17:03

Hmm...

Muss die Kommunikation direkt über die USB-Schnittstelle erfolgen?

Wenn es darum geht, z.B. ESC-Commandos oder direkte Scriptbefehle an den Drucker zu schicken, geht das auch mit dem Treiber unter der Verwendung der 'ESCAPE'-API von Microsoft.

Hiermit kann in einer Art RAW-Modus am Treiber vorbei mit dem Drucker kommuniziert werden.

Benötigt wird dann einfach nur die normale Drucker-Schnittstelle vom installierten Treiber.

Somit deutlich weniger Geräte wie direkt über USB.

HolgerX


ruewue - Mo 02.11.15 08:44

Hallo HolgerX,

die Kommunikation mit dem Drucker muss direkt erfolgen, da am Drucker ein Applikator installiert ist der zwar vom Drucker gesteuert wird, aber dessen Informationen ich vom Drucker abfrage um im Fehlerfall zu reagieren. Dies funktioniert auch super. Da ich aber dafür den Device Path benötige, welchen ich in der Grundinstallation auch eintrage. Bei einem Druckerwechsel im laufenden Betrieb funktioniert dies auch (WM_DEVICECHANGE) aber solle der Drucker im Offlinebetrieb gewechselt werden, so kann ich zwar über den Druckertreiber drucken, doch der Device Path stimmt nicht mehr und ich erhalte keine Information über den Zustand des Applikators.

Ich muss also beim Programmstart den Device Path des aktiven USB Druckers ermitteln und diesen dann in die Programmkonfiguration übernehmen. Es geht halt darum das die Software schon geraume Zeit im Einsatz ist, aber nun diese Erweiterung der Kommunikation benötigt wird. Es sollte also nur ein minimaler Aufwand, also eine Abfrage, betrieben werden.

Gruß
Ruewue


Narses - Mo 02.11.15 14:46

Moin!

Ohne spezielle Kenntnisse in der Richtung USB-Drucker zu haben: was ist denn mit WMI, da schonmal reingesehen? Da kann man doch alles mögliche vom System standardisiert erfragen... :lupe:

Wenn das auch nichts bringt: kann man dem Tool, mit dem du das sonst manuell machst, die Informationen vielleicht irgendwie per Kommandozeile entlocken? :suspect:

cu
Narses


ruewue - Di 03.11.15 11:26

Hallo Narses,

die Idee ist nicht schlecht. Werde mich jetzt mal mit WMI befassen. Ist vieleicht wirklich der richtige Weg. Erst Mal Danke!

Gruß

Ruewue


Delete - Di 03.11.15 14:43

Beispiel - deaktivierte Zeilen müssen noch angepasst werden


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
//-----------------------------------------------------------------------------------------------------
//     This code was generated by the Wmi Delphi Code Creator http://theroadtodelphi.wordpress.com
//     Version: 1.8.3.0 
//     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_Win32_PrinterInfo;  //20151103

{$APPTYPE CONSOLE}

uses
//  SysUtils, ActiveX, ComObj, Variants;
  System.SysUtils,
  Winapi.ActiveX,
  System.Win.ComObj,
  System.Variants;

const
  WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020;

function VarToInt(const AVariant: Variant): INT64;// integer;
begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end;

// Funktionen und Verwaltung des logischen Druckers.

procedure  GetWin32_PrinterInfo;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Printer','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Attributes                     %d',[VARTOINT(FWbemObject.Attributes)]));// Uint32
    Writeln(Format('Availability                   %d',[VARTOINT(FWbemObject.Availability)]));// Uint16
//    Writeln(Format('AvailableJobSheets             %s',[VARTOSTR(FWbemObject.AvailableJobSheets)]));// Array of String
    Writeln(Format('AveragePagesPerMinute          %d',[VARTOINT(FWbemObject.AveragePagesPerMinute)]));// Uint32
//    Writeln(Format('Capabilities                   %d',[VARTOINT(FWbemObject.Capabilities)]));// Array of Uint16
//    Writeln(Format('CapabilityDescriptions         %s',[VARTOSTR(FWbemObject.CapabilityDescriptions)]));// Array of String
    Writeln(Format('Caption                        %s',[VARTOSTR(FWbemObject.Caption)]));// String
//    Writeln(Format('CharSetsSupported              %s',[VARTOSTR(FWbemObject.CharSetsSupported)]));// Array of String
    Writeln(Format('Comment                        %s',[VARTOSTR(FWbemObject.Comment)]));// String
    Writeln(Format('ConfigManagerErrorCode         %d',[VARTOINT(FWbemObject.ConfigManagerErrorCode)]));// Uint32
    Writeln(Format('ConfigManagerUserConfig        %s',[VARTOSTR(FWbemObject.ConfigManagerUserConfig)]));// Boolean
    Writeln(Format('CreationClassName              %s',[VARTOSTR(FWbemObject.CreationClassName)]));// String
    Writeln(Format('CurrentCapabilities            %d',[VARTOINT(FWbemObject.CurrentCapabilities)]));// Array of Uint16
    Writeln(Format('CurrentCharSet                 %s',[VARTOSTR(FWbemObject.CurrentCharSet)]));// String
    Writeln(Format('CurrentLanguage                %d',[VARTOINT(FWbemObject.CurrentLanguage)]));// Uint16
    Writeln(Format('CurrentMimeType                %s',[VARTOSTR(FWbemObject.CurrentMimeType)]));// String
    Writeln(Format('CurrentNaturalLanguage         %s',[VARTOSTR(FWbemObject.CurrentNaturalLanguage)]));// String
    Writeln(Format('CurrentPaperType               %s',[VARTOSTR(FWbemObject.CurrentPaperType)]));// String
    Writeln(Format('Default                        %s',[VARTOSTR(FWbemObject.Default)]));// Boolean
    Writeln(Format('DefaultCapabilities            %d',[VARTOINT(FWbemObject.DefaultCapabilities)]));// Array of Uint16
    Writeln(Format('DefaultCopies                  %d',[VARTOINT(FWbemObject.DefaultCopies)]));// Uint32
    Writeln(Format('DefaultLanguage                %d',[VARTOINT(FWbemObject.DefaultLanguage)]));// Uint16
    Writeln(Format('DefaultMimeType                %s',[VARTOSTR(FWbemObject.DefaultMimeType)]));// String
    Writeln(Format('DefaultNumberUp                %d',[VARTOINT(FWbemObject.DefaultNumberUp)]));// Uint32
    Writeln(Format('DefaultPaperType               %s',[VARTOSTR(FWbemObject.DefaultPaperType)]));// String
    Writeln(Format('DefaultPriority                %d',[VARTOINT(FWbemObject.DefaultPriority)]));// Uint32
    Writeln(Format('Description                    %s',[VARTOSTR(FWbemObject.Description)]));// String
    Writeln(Format('DetectedErrorState             %d',[VARTOINT(FWbemObject.DetectedErrorState)]));// Uint16
    Writeln(Format('DeviceID                       %s',[VARTOSTR(FWbemObject.DeviceID)]));// String
    Writeln(Format('Direct                         %s',[VARTOSTR(FWbemObject.Direct)]));// Boolean
    Writeln(Format('DoCompleteFirst                %s',[VARTOSTR(FWbemObject.DoCompleteFirst)]));// Boolean
    Writeln(Format('DriverName                     %s',[VARTOSTR(FWbemObject.DriverName)]));// String
    Writeln(Format('EnableBIDI                     %s',[VARTOSTR(FWbemObject.EnableBIDI)]));// Boolean
    Writeln(Format('EnableDevQueryPrint            %s',[VARTOSTR(FWbemObject.EnableDevQueryPrint)]));// Boolean
    Writeln(Format('ErrorCleared                   %s',[VARTOSTR(FWbemObject.ErrorCleared)]));// Boolean
    Writeln(Format('ErrorDescription               %s',[VARTOSTR(FWbemObject.ErrorDescription)]));// String
//    Writeln(Format('ErrorInformation               %s',[VARTOSTR(FWbemObject.ErrorInformation)]));// Array of String
    Writeln(Format('ExtendedDetectedErrorState     %d',[VARTOINT(FWbemObject.ExtendedDetectedErrorState)]));// Uint16
    Writeln(Format('ExtendedPrinterStatus          %d',[VARTOINT(FWbemObject.ExtendedPrinterStatus)]));// Uint16
    Writeln(Format('Hidden                         %s',[VARTOSTR(FWbemObject.Hidden)]));// Boolean
    Writeln(Format('HorizontalResolution           %d',[VARTOINT(FWbemObject.HorizontalResolution)]));// Uint32
    Writeln(Format('InstallDate                    %s',[VARTOSTR(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('JobCountSinceLastReset         %d',[VARTOINT(FWbemObject.JobCountSinceLastReset)]));// Uint32
    Writeln(Format('KeepPrintedJobs                %s',[VARTOSTR(FWbemObject.KeepPrintedJobs)]));// Boolean
//    Writeln(Format('LanguagesSupported             %d',[VARTOINT(FWbemObject.LanguagesSupported)]));// Array of Uint16
    Writeln(Format('LastErrorCode                  %d',[VARTOINT(FWbemObject.LastErrorCode)]));// Uint32
    Writeln(Format('Local                          %s',[VARTOSTR(FWbemObject.Local)]));// Boolean
    Writeln(Format('Location                       %s',[VARTOSTR(FWbemObject.Location)]));// String
    Writeln(Format('MarkingTechnology              %d',[VARTOINT(FWbemObject.MarkingTechnology)]));// Uint16
    Writeln(Format('MaxCopies                      %d',[VARTOINT(FWbemObject.MaxCopies)]));// Uint32
    Writeln(Format('MaxNumberUp                    %d',[VARTOINT(FWbemObject.MaxNumberUp)]));// Uint32
    Writeln(Format('MaxSizeSupported               %d',[VARTOINT(FWbemObject.MaxSizeSupported)]));// Uint32
//    Writeln(Format('MimeTypesSupported             %s',[VARTOSTR(FWbemObject.MimeTypesSupported)]));// Array of String
    Writeln(Format('Name                           %s',[VARTOSTR(FWbemObject.Name)]));// String
//    Writeln(Format('NaturalLanguagesSupported      %s',[VARTOSTR(FWbemObject.NaturalLanguagesSupported)]));// Array of String
    Writeln(Format('Network                        %s',[VARTOSTR(FWbemObject.Network)]));// Boolean
//    Writeln(Format('PaperSizesSupported            %d',[VARTOINT(FWbemObject.PaperSizesSupported)]));// Array of Uint16
//    Writeln(Format('PaperTypesAvailable            %s',[VARTOSTR(FWbemObject.PaperTypesAvailable)]));// Array of String
    Writeln(Format('Parameters                     %s',[VARTOSTR(FWbemObject.Parameters)]));// String
    Writeln(Format('PNPDeviceID                    %s',[VARTOSTR(FWbemObject.PNPDeviceID)]));// String
    Writeln(Format('PortName                       %s',[VARTOSTR(FWbemObject.PortName)]));// String
    Writeln(Format('PowerManagementCapabilities    %d',[VARTOINT(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16
    Writeln(Format('PowerManagementSupported       %s',[VARTOSTR(FWbemObject.PowerManagementSupported)]));// Boolean
//    Writeln(Format('PrinterPaperNames              %s',[VARTOSTR(FWbemObject.PrinterPaperNames)]));// Array of String
    Writeln(Format('PrinterState                   %d',[VARTOINT(FWbemObject.PrinterState)]));// Uint32
    Writeln(Format('PrinterStatus                  %d',[VARTOINT(FWbemObject.PrinterStatus)]));// Uint16
    Writeln(Format('PrintJobDataType               %s',[VARTOSTR(FWbemObject.PrintJobDataType)]));// String
    Writeln(Format('PrintProcessor                 %s',[VARTOSTR(FWbemObject.PrintProcessor)]));// String
    Writeln(Format('Priority                       %d',[VARTOINT(FWbemObject.Priority)]));// Uint32
    Writeln(Format('Published                      %s',[VARTOSTR(FWbemObject.Published)]));// Boolean
    Writeln(Format('Queued                         %s',[VARTOSTR(FWbemObject.Queued)]));// Boolean
    Writeln(Format('RawOnly                        %s',[VARTOSTR(FWbemObject.RawOnly)]));// Boolean
    Writeln(Format('SeparatorFile                  %s',[VARTOSTR(FWbemObject.SeparatorFile)]));// String
    Writeln(Format('ServerName                     %s',[VARTOSTR(FWbemObject.ServerName)]));// String
    Writeln(Format('Shared                         %s',[VARTOSTR(FWbemObject.Shared)]));// Boolean
    Writeln(Format('ShareName                      %s',[VARTOSTR(FWbemObject.ShareName)]));// String
    Writeln(Format('SpoolEnabled                   %s',[VARTOSTR(FWbemObject.SpoolEnabled)]));// Boolean
    Writeln(Format('StartTime                      %s',[VARTOSTR(FWbemObject.StartTime)]));// Datetime
    Writeln(Format('Status                         %s',[VARTOSTR(FWbemObject.Status)]));// String
    Writeln(Format('StatusInfo                     %d',[VARTOINT(FWbemObject.StatusInfo)]));// Uint16
    Writeln(Format('SystemCreationClassName        %s',[VARTOSTR(FWbemObject.SystemCreationClassName)]));// String
    Writeln(Format('SystemName                     %s',[VARTOSTR(FWbemObject.SystemName)]));// String
    Writeln(Format('TimeOfLastReset                %s',[VARTOSTR(FWbemObject.TimeOfLastReset)]));// Datetime
    Writeln(Format('UntilTime                      %s',[VARTOSTR(FWbemObject.UntilTime)]));// Datetime
    Writeln(Format('VerticalResolution             %d',[VARTOINT(FWbemObject.VerticalResolution)]));// Uint32
    Writeln(Format('WorkOffline                    %s',[VARTOSTR(FWbemObject.WorkOffline)]));// Boolean
    Writeln('--------------------------------------------------------------------------');
    FWbemObject:=Unassigned;
  end;
end;

procedure  GetWin32_PrinterConfigurationInfo;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PrinterConfiguration','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('BitsPerPel              %d',[VARTOINT(FWbemObject.BitsPerPel)]));// Uint32
    Writeln(Format('Caption                 %s',[VARTOSTR(FWbemObject.Caption)]));// String
    Writeln(Format('Collate                 %s',[VARTOSTR(FWbemObject.Collate)]));// Boolean
    Writeln(Format('Color                   %d',[VARTOINT(FWbemObject.Color)]));// Uint32
    Writeln(Format('Copies                  %d',[VARTOINT(FWbemObject.Copies)]));// Uint32
    Writeln(Format('Description             %s',[VARTOSTR(FWbemObject.Description)]));// String
    Writeln(Format('DeviceName              %s',[VARTOSTR(FWbemObject.DeviceName)]));// String
    Writeln(Format('DisplayFlags            %d',[VARTOINT(FWbemObject.DisplayFlags)]));// Uint32
    Writeln(Format('DisplayFrequency        %d',[VARTOINT(FWbemObject.DisplayFrequency)]));// Uint32
    Writeln(Format('DitherType              %d',[VARTOINT(FWbemObject.DitherType)]));// Uint32
    Writeln(Format('DriverVersion           %d',[VARTOINT(FWbemObject.DriverVersion)]));// Uint32
    Writeln(Format('Duplex                  %s',[VARTOSTR(FWbemObject.Duplex)]));// Boolean
    Writeln(Format('FormName                %s',[VARTOSTR(FWbemObject.FormName)]));// String
    Writeln(Format('HorizontalResolution    %d',[VARTOINT(FWbemObject.HorizontalResolution)]));// Uint32
    Writeln(Format('ICMIntent               %d',[VARTOINT(FWbemObject.ICMIntent)]));// Uint32
    Writeln(Format('ICMMethod               %d',[VARTOINT(FWbemObject.ICMMethod)]));// Uint32
    Writeln(Format('LogPixels               %d',[VARTOINT(FWbemObject.LogPixels)]));// Uint32
    Writeln(Format('MediaType               %d',[VARTOINT(FWbemObject.MediaType)]));// Uint32
    Writeln(Format('Name                    %s',[VARTOSTR(FWbemObject.Name)]));// String
    Writeln(Format('Orientation             %d',[VARTOINT(FWbemObject.Orientation)]));// Uint32
    Writeln(Format('PaperLength             %d',[VARTOINT(FWbemObject.PaperLength)]));// Uint32
    Writeln(Format('PaperSize               %s',[VARTOSTR(FWbemObject.PaperSize)]));// String
    Writeln(Format('PaperWidth              %d',[VARTOINT(FWbemObject.PaperWidth)]));// Uint32
    Writeln(Format('PelsHeight              %d',[VARTOINT(FWbemObject.PelsHeight)]));// Uint32
    Writeln(Format('PelsWidth               %d',[VARTOINT(FWbemObject.PelsWidth)]));// Uint32
    Writeln(Format('PrintQuality            %d',[VARTOINT(FWbemObject.PrintQuality)]));// Uint32
    Writeln(Format('Scale                   %d',[VARTOINT(FWbemObject.Scale)]));// Uint32
    Writeln(Format('SettingID               %s',[VARTOSTR(FWbemObject.SettingID)]));// String
    Writeln(Format('SpecificationVersion    %d',[VARTOINT(FWbemObject.SpecificationVersion)]));// Uint32
    Writeln(Format('TTOption                %d',[VARTOINT(FWbemObject.TTOption)]));// Uint32
    Writeln(Format('VerticalResolution      %d',[VARTOINT(FWbemObject.VerticalResolution)]));// Uint32
    Writeln(Format('XResolution             %d',[VARTOINT(FWbemObject.XResolution)]));// Uint32
    Writeln(Format('YResolution             %d',[VARTOINT(FWbemObject.YResolution)]));// Uint32
    Writeln('========================================================================');
    FWbemObject:=Unassigned;
  end;
end;

procedure  GetWin32_PrintJobInfo;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PrintJob','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Caption           %s',[VARTOSTR(FWbemObject.Caption)]));// String
    Writeln(Format('Color             %s',[VARTOSTR(FWbemObject.Color)]));// String
    Writeln(Format('DataType          %s',[VARTOSTR(FWbemObject.DataType)]));// String
    Writeln(Format('Description       %s',[VARTOSTR(FWbemObject.Description)]));// String
    Writeln(Format('Document          %s',[VARTOSTR(FWbemObject.Document)]));// String
    Writeln(Format('DriverName        %s',[VARTOSTR(FWbemObject.DriverName)]));// String
    Writeln(Format('ElapsedTime       %s',[VARTOSTR(FWbemObject.ElapsedTime)]));// Datetime
    Writeln(Format('HostPrintQueue    %s',[VARTOSTR(FWbemObject.HostPrintQueue)]));// String
    Writeln(Format('InstallDate       %s',[VARTOSTR(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('JobId             %d',[VARTOINT(FWbemObject.JobId)]));// Uint32
    Writeln(Format('JobStatus         %s',[VARTOSTR(FWbemObject.JobStatus)]));// String
    Writeln(Format('Name              %s',[VARTOSTR(FWbemObject.Name)]));// String
    Writeln(Format('Notify            %s',[VARTOSTR(FWbemObject.Notify)]));// String
    Writeln(Format('Owner             %s',[VARTOSTR(FWbemObject.Owner)]));// String
    Writeln(Format('PagesPrinted      %d',[VARTOINT(FWbemObject.PagesPrinted)]));// Uint32
    Writeln(Format('PaperLength       %d',[VARTOINT(FWbemObject.PaperLength)]));// Uint32
    Writeln(Format('PaperSize         %s',[VARTOSTR(FWbemObject.PaperSize)]));// String
    Writeln(Format('PaperWidth        %d',[VARTOINT(FWbemObject.PaperWidth)]));// Uint32
    Writeln(Format('Parameters        %s',[VARTOSTR(FWbemObject.Parameters)]));// String
    Writeln(Format('PrintProcessor    %s',[VARTOSTR(FWbemObject.PrintProcessor)]));// String
    Writeln(Format('Priority          %d',[VARTOINT(FWbemObject.Priority)]));// Uint32
    Writeln(Format('Size              %d',[VARTOINT(FWbemObject.Size)]));// Uint32
    Writeln(Format('SizeHigh          %d',[VARTOINT(FWbemObject.SizeHigh)]));// Uint32
    Writeln(Format('StartTime         %s',[VARTOSTR(FWbemObject.StartTime)]));// Datetime
    Writeln(Format('Status            %s',[VARTOSTR(FWbemObject.Status)]));// String
    Writeln(Format('StatusMask        %d',[VARTOINT(FWbemObject.StatusMask)]));// Uint32
    Writeln(Format('TimeSubmitted     %s',[VARTOSTR(FWbemObject.TimeSubmitted)]));// Datetime
    Writeln(Format('TotalPages        %d',[VARTOINT(FWbemObject.TotalPages)]));// Uint32
    Writeln(Format('UntilTime         %s',[VARTOSTR(FWbemObject.UntilTime)]));// Datetime
    Writeln('############################################################');
    FWbemObject:=Unassigned;
  end;
end;

procedure  GetWin32_PrinterDriverInfo;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PrinterDriver','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Caption                    %s',[VARTOSTR(FWbemObject.Caption)]));// String
    Writeln(Format('ConfigFile                 %s',[VARTOSTR(FWbemObject.ConfigFile)]));// String
    Writeln(Format('CreationClassName          %s',[VARTOSTR(FWbemObject.CreationClassName)]));// String
    Writeln(Format('DataFile                   %s',[VARTOSTR(FWbemObject.DataFile)]));// String
    Writeln(Format('DefaultDataType            %s',[VARTOSTR(FWbemObject.DefaultDataType)]));// String
//    Writeln(Format('DependentFiles             %s',[VARTOSTR(FWbemObject.DependentFiles)]));// Array of String
    Writeln(Format('Description                %s',[VARTOSTR(FWbemObject.Description)]));// String
    Writeln(Format('DriverPath                 %s',[VARTOSTR(FWbemObject.DriverPath)]));// String
    Writeln(Format('FilePath                   %s',[VARTOSTR(FWbemObject.FilePath)]));// String
    Writeln(Format('HelpFile                   %s',[VARTOSTR(FWbemObject.HelpFile)]));// String
    Writeln(Format('InfName                    %s',[VARTOSTR(FWbemObject.InfName)]));// String
    Writeln(Format('InstallDate                %s',[VARTOSTR(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('MonitorName                %s',[VARTOSTR(FWbemObject.MonitorName)]));// String
    Writeln(Format('Name                       %s',[VARTOSTR(FWbemObject.Name)]));// String
    Writeln(Format('OEMUrl                     %s',[VARTOSTR(FWbemObject.OEMUrl)]));// String
    Writeln(Format('Started                    %s',[VARTOSTR(FWbemObject.Started)]));// Boolean
    Writeln(Format('StartMode                  %s',[VARTOSTR(FWbemObject.StartMode)]));// String
    Writeln(Format('Status                     %s',[VARTOSTR(FWbemObject.Status)]));// String
    Writeln(Format('SupportedPlatform          %s',[VARTOSTR(FWbemObject.SupportedPlatform)]));// String
    Writeln(Format('SystemCreationClassName    %s',[VARTOSTR(FWbemObject.SystemCreationClassName)]));// String
    Writeln(Format('SystemName                 %s',[VARTOSTR(FWbemObject.SystemName)]));// String
    Writeln(Format('Version                    %d',[VARTOINT(FWbemObject.Version)]));// Uint16
    Writeln('::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::');
    FWbemObject:=Unassigned;
  end;
end;

begin
 try
    CoInitialize(nil);
    try
      GetWin32_PrinterInfo;
      GetWin32_PrinterConfigurationInfo;
      GetWin32_PrintJobInfo;
      GetWin32_PrinterDriverInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.


ruewue - Di 03.11.15 15:15

Danke hathor!

Der Code funktioniert einwandfrei. Aber er bringt mir das gleiche Ergebnis wie ich selbst schon gefunden hatte, nämlich nichts. Es wird viel an Info rausgegeben aber der DevicePath nicht.

Aber recht herzlichen Dank noch mal!

Gruß

ruewue


Gerd Kayser - Di 03.11.15 15:40

user profile iconruewue hat folgendes geschrieben Zum zitierten Posting springen:
Es wird viel an Info rausgegeben aber der DevicePath nicht.

Wenn ich mich nicht irre, müsste es mit der SetupAPI gehen (Struktur SP_DEVICE_INTERFACE_DETAIL_DATA). Siehe https://msdn.microsoft.com/en-us/library/windows/hardware/ff552343(v=vs.85).aspx und http://blog.peter.skarpetis.com/archives/2005/04/07/getting-a-handle-on-usbprintsys/


Delete - Mi 04.11.15 00:12

Ich hab's: Mit Win32_PnPEntity sollte es gehen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
//-----------------------------------------------------------------------------------------------------
//     This code was generated by the Wmi Delphi Code Creator http://theroadtodelphi.wordpress.com
//     Version: 1.8.3.0 
//     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;
  System.SysUtils,
  Winapi.ActiveX,
  System.Win.ComObj,
  System.Variants;

const
  WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020;

function VarToInt(const AVariant: Variant): INT64;// integer;
begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end;

// Die Klasse "Win32_PnPEntity" stellt die Eigenschaften eines Plug & Play-Geräts 
// dar. Plug & Play-Einheiten werden als Einträge im Geräte-Manager angezeigt.

procedure  GetWin32_PnPEntityInfo;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PnPEntity','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Availability                   %d',[VarToInt(FWbemObject.Availability)]));// Uint16
    Writeln(Format('Caption                        %s',[VarToStr(FWbemObject.Caption)]));// String
    Writeln(Format('ClassGuid                      %s',[VarToStr(FWbemObject.ClassGuid)]));// String
//    Writeln(Format('CompatibleID                   %s',[VarToStr(FWbemObject.CompatibleID)]));// Array of String
    Writeln(Format('ConfigManagerErrorCode         %d',[VarToInt(FWbemObject.ConfigManagerErrorCode)]));// Uint32
    Writeln(Format('ConfigManagerUserConfig        %s',[VarToStr(FWbemObject.ConfigManagerUserConfig)]));// Boolean
    Writeln(Format('CreationClassName              %s',[VarToStr(FWbemObject.CreationClassName)]));// String
    Writeln(Format('Description                    %s',[VarToStr(FWbemObject.Description)]));// String
    Writeln(Format('DeviceID                       %s',[VarToStr(FWbemObject.DeviceID)]));// String
    Writeln(Format('ErrorCleared                   %s',[VarToStr(FWbemObject.ErrorCleared)]));// Boolean
    Writeln(Format('ErrorDescription               %s',[VarToStr(FWbemObject.ErrorDescription)]));// String
//    Writeln(Format('HardwareID                     %s',[VarToStr(FWbemObject.HardwareID)]));// Array of String
    Writeln(Format('InstallDate                    %s',[VarToStr(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('LastErrorCode                  %d',[VarToInt(FWbemObject.LastErrorCode)]));// Uint32
    Writeln(Format('Manufacturer                   %s',[VarToStr(FWbemObject.Manufacturer)]));// String
    Writeln(Format('Name                           %s',[VarToStr(FWbemObject.Name)]));// String
    Writeln(Format('PNPDeviceID                    %s',[VarToStr(FWbemObject.PNPDeviceID)]));// String
//    Writeln(Format('PowerManagementCapabilities    %d',[VarToInt(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16
    Writeln(Format('PowerManagementSupported       %s',[VarToStr(FWbemObject.PowerManagementSupported)]));// Boolean
    Writeln(Format('Service                        %s',[VarToStr(FWbemObject.Service)]));// String
    Writeln(Format('Status                         %s',[VarToStr(FWbemObject.Status)]));// String
    Writeln(Format('StatusInfo                     %d',[VarToInt(FWbemObject.StatusInfo)]));// Uint16
    Writeln(Format('SystemCreationClassName        %s',[VarToStr(FWbemObject.SystemCreationClassName)]));// String
    Writeln(Format('SystemName                     %s',[VarToStr(FWbemObject.SystemName)]));// String
      
    Writeln('-------------------------------------------------------------------');
    FWbemObject:=Unassigned;
  end;
end;

begin
 try
    CoInitialize(nil);
    try
      GetWin32_PnPEntityInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.


Delete - Mi 04.11.15 08:53

Mein Drucker wird so gemeldet:
Caption: Samsung Universal Print Driver
PNPDeviceID: SWD\PRINTENUM\{263D4460-F9A1-4A93-A84F-F9E2D1634F60}

Kurzversion mit ClassGuid = USB Raw Device:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.ActiveX, System.Win.ComObj, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure MM(s:string); begin Form1.Memo1.Lines.Add(s); end;

procedure TForm1.Button1Click(Sender: TObject);
var
    Locator:OleVariant;
    WMI:OleVariant;
    RET:OleVariant;
    Enum:IEnumVariant;
    Tmp:OleVariant;
    Value:Cardinal;
begin
    Locator:=CreateOleObject('WbemScripting.SWbemLocator');
    WMI := Locator.ConnectServer('.''''''');
    Ret := WMI.ExecQuery('SELECT * FROM Win32_PnPEntity');
    Enum:= IUnknown(RET._NewEnum) as IEnumVariant;
    while (Enum.Next(1, Tmp, Value) = S_OK) do
    begin
    if Tmp.ClassGuid='{a5dcbf10-6530-11d2-901f-00c04fb951ed}' then // USB Raw Device
//Alternative:      if Tmp.Caption=<PrinterName> then //siehe PNPDeviceID.exe
          MM('PNPDeviceID: '+Tmp.PNPDeviceID);
    end;
end;

end.