![]() |
DeviceCapabilities(DC_BINNAMES) liefert -1
Hallo zusammen!
In unserer Anwendung lesen wir Schächte des aktuellen Druckers aus. Das funktioniert (mittlerweile :mrgreen:) auch gut. Zur Feststellung der Anzahl rufen wir
Delphi-Quellcode:
auf. Das liefert nun bei einem unserer Kunden auf einem HP Deskjet 5400
Count := DeviceCapabilities(PChar(SomeDevice), PChar(SomePort), DC_BINNAMES, nil, nil);
Delphi-Quellcode:
zurück. Ich meine,
Count = -1
![]()
Delphi-Quellcode:
eingebaut und kriege "Systemfehler. Code: 1722. Der RPC-Server ist nicht verfügbar."
if Count < 0 then
RaiseLastOSError; Meine Fragen:
|
AW: DeviceCapabilities(DC_BINNAMES) liefert -1
Hi,
setze ersteinmal unmittelbar vor dem Aufruf LastError zurück:
Delphi-Quellcode:
SetLastError( NO_ERROR ); //NO_ERROR ist in Winapi.Windows.pas definiert
Erst dann weißt Du, ob sich der Fehler überhaupt auf Deinen Aufruf bezieht. |
AW: DeviceCapabilities(DC_BINNAMES) liefert -1
Zitat:
|
AW: DeviceCapabilities(DC_BINNAMES) liefert -1
Für diese Funktion ist GetLastError eigentlich falsch. (einer der darin aufgrufenden APIs könnte eventuell einen Fehlercode setzen, aber selbst wenn eine API das macht, heißt es noch lange nicht, daß die eigentliche Funktion nicht funktionierte)
-1 ist ein Fehlercode und besagt hier, daß keine Schächste unterstützt werden. Es gibt also nur einen Schacht und keine Funktion zu dessen Auswahl. :zwinker: Alternativ könnte das aber auch heißen, daß der Drucker nicht gefunden wurde, oder Treiber/Drucker defekt sind, was aber auch nur wieder bedeudet, daß die Stelle, welche man grade frage, die Funktion "Gibt mir deine Schächte!" nicht unterstützt. Vermutlich kannst'e das ganz einfach so machen:
Delphi-Quellcode:
Count := Max(DeviceCapabilities(PChar(SomeDevice), PChar(SomePort), DC_BINNAMES, nil, nil), 1);
|
AW: DeviceCapabilities(DC_BINNAMES) liefert -1
Vielleicht kann man auch erstmal eine andere Capability nachfragen, um zu sehen, ob da was kommt. Dann würde es ja ggf. nicht am Treiber oder so liegen und Himi's Vermutung mit den Schächten stützen.
|
AW: DeviceCapabilities(DC_BINNAMES) liefert -1
Bin ich per Remote Desktop mit dem PC verbunde, liefert der Abruf DeviceCapabilities mit DC_BINNAMES für jeden Drucker -1 zurück.
Lokal angemeldet, selbst in einer virtuellen Maschine funktioniert das einwandfrei. Gibt es eine Alternative um die Papiernamen zu ermitteln? |
AW: DeviceCapabilities(DC_BINNAMES) liefert -1
Hast du es schon mit WMI versucht?
Delphi-Quellcode:
Ergibt bei mir:
//-----------------------------------------------------------------------------------------------------
// This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.9.9.482 // http://code.google.com/p/wmi-delphi-code-creator/ // Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/ // Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2015 //----------------------------------------------------------------------------------------------------- // // 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; // Funktionen und Verwaltung des logischen Druckers. procedure GetWin32_PrinterInfo; const WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; LAllPaperNames: string; LPrinterPaperNames: TArray<string>; LPrinterPaperName: string; 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('DeviceID %s',[String(FWbemObject.DeviceID)]));// String Writeln('PaperSizesSupported Count: ', Length(TArray<Integer>(FWbemObject.PaperSizesSupported)));// Array of Uint16 if VarIsArray(FWbemObject.PrinterPaperNames) then begin LPrinterPaperNames := TArray<string>(FWbemObject.PrinterPaperNames); LAllPaperNames := ''; for LPrinterPaperName in LPrinterPaperNames do begin LAllPaperNames := LAllPaperNames + LPrinterPaperName + ', '; end; SetLength(LAllPaperNames, Length(LAllPaperNames) - 2); Writeln(LAllPaperNames); end; Writeln(''); FWbemObject:=Unassigned; end; end; begin try CoInitialize(nil); try GetWin32_PrinterInfo; 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.
Code:
DeviceID: OneNote for Windows 10
PaperSizesSupported Count: 2 Letter, A4 DeviceID: OneNote (Desktop) PaperSizesSupported Count: 10 Letter, Tabloid, Legal, Executive, A3, A4, B4 (JIS), B5 (JIS), Umschlag 10, Umschlag Monarch DeviceID: Microsoft XPS Document Writer PaperSizesSupported Count: 107 Letter, Letter klein, Tabloid, Ledger, Legal, Statement, Executive, A3, A4, A4 Klein, A5, B4 (JIS), B5 (JIS), Folie, Quarto, 10×14, 11×17, Notiz, Umschlag 9, Umschlag 10, Umschlag 11, Umschlag 12, Umschlag 14, C-Blatt, D-Blatt, E-Blatt, Umschlag DL, Umschlag C5, Umschlag C3, Umschlag C4, Umschlag C6, Umschlag C65, Umschlag B4, Umschlag B5, Umschlag B6, Umschlag, Umschlag Monarch, 6 3/4 Umschlag, US Standardendlospapier, German Std Endlospapier, German Legal Endlospapier, B4 (ISO), Jap. Postkarte, 9×11, 10×11, 15×11, Umschlag Invite, Letter Extra, Legal Extra, A4 Extra, Letter Quer, A4 Quer, Letter Extra quer, Super A, Super B, Letter Plus, A4 Plus, A5 Quer, B5 (JIS) Quer, A3 Extra, A5 Extra, B5 (ISO) Extra, A2, A3 Quer, A3 Extra Quer, Jap. Doppelpostkarte, A6, Jap. Umschlag Kaku 2, Jap. Umschlag Kaku 3, Jap. Umschlag Chou 3, Jap. Umschlag Chou 4, Letter Gedreht, A3 Gedreht, A4 Gedreht, A5 Gedreht, B4 (JIS) Gedreht, B5 (JIS) Gedreht, Jap. Postkarte Gedreht, Jap. Doppelpostkarte Gedreht, A6 Gedreht, Jap. Umschlag Kaku 2 Gedreht, Jap. Umschlag Kaku 3 Gedreht, Jap. Umschlag Chou 3 Gedreht, Jap. Umschlag Chou 4 Gedreht, B6 (JIS), B6 (JIS) Gedreht, 12×11, Jap. Umschlag You 4, Jap. Umschlag You 4 Gedreht, PRC Umschlag 1, PRC Umschlag 3, PRC Umschlag 4, PRC Umschlag 5, PRC Umschlag 6, PRC Umschlag 7, PRC Umschlag 8, PRC Umschlag 9, PRC Umschlag 10, PRC Umschlag 1 Gedreht, PRC Umschlag 3 Gedreht, PRC Umschlag 4 Gedreht, PRC Umschlag 5 Gedreht, PRC Umschlag 6 Gedreht, PRC Umschlag 7 Gedreht, PRC Umschlag 8 Gedreht, PRC Umschlag 9 Gedreht, Benutzerdefinierte Größe DeviceID: Microsoft Print to PDF PaperSizesSupported Count: 10 Letter, Tabloid, Legal, Statement, Executive, A3, A4, A5, B4 (JIS), B5 (JIS) DeviceID: LP 3335 KX Hard- und Software PaperSizesSupported Count: 22 Letter, Legal, Statement, Executive, A3, A4, A5, A6, Folio, B4, B5 (JIS), B6, B5 (ISO), Briefumschlag #10, Briefumschlag #9, Briefumschlag Monarch, Briefumschlag #6, Briefumschlag C5, Briefumschlag DL, 16K, Oficio II, Custom DeviceID: Fax PaperSizesSupported Count: 69 Letter, Letter klein, Legal, Statement, Executive, A4, A4 Klein, A5, B5 (JIS), Folie, Quarto, Notiz, Umschlag 9, Umschlag 10, Umschlag 11, Umschlag 12, Umschlag 14, Umschlag DL, Umschlag C5, Umschlag C6, Umschlag C65, Umschlag B5, Umschlag B6, Umschlag, Umschlag Monarch, 6 3/4 Umschlag, German Std Endlospapier, German Legal Endlospapier, Jap. Postkarte, Reserved48, Reserved49, Letter Quer, A4 Quer, Letter Plus, A4 Plus, A5 Quer, B5 (JIS) Quer, A5 Extra, B5 (ISO) Extra, Jap. Doppelpostkarte, A6, Jap. Umschlag Kaku 3, Jap. Umschlag Chou 3, Jap. Umschlag Chou 4, A5 Gedreht, Jap. Postkarte Gedreht, Jap. Doppelpostkarte Gedreht, A6 Gedreht, Jap. Umschlag Chou 4 Gedreht, B6 (JIS), B6 (JIS) Gedreht, Jap. Umschlag You 4, PRC 16K, PRC 32K, PRC 32K (groß), PRC Umschlag 1, PRC Umschlag 2, PRC Umschlag 3, PRC Umschlag 4, PRC Umschlag 5, PRC Umschlag 6, PRC Umschlag 7, PRC Umschlag 8, PRC 32K Gedreht, PRC 32K (groß) Gedreht, PRC Umschlag 1 Gedreht, PRC Umschlag 2 Gedreht, PRC Umschlag 3 Gedreht, PRC Umschlag 4 Gedreht DeviceID: 3005ci PaperSizesSupported Count: 33 Letter, Legal, Ledger (11 x 17), Statement, Executive, A0, A1, A2, A3, A4, A5, A6, Folio, B1, B2, B3, B4, B5 (JIS), B6, B5 (ISO), Briefumschlag #10, Briefumschlag #9, Briefumschlag Monarch, Briefumschlag #6, Briefumschlag C4, Briefumschlag C5, Briefumschlag DL, Oficio II, 8K, 16K, 216 x 340 mm, 12 x 18, Custom Press Enter to exit |
AW: DeviceCapabilities(DC_BINNAMES) liefert -1
Es kann natürlich auch sein, dass diese Capabilities vom virtuellen Drucker-Treiber des RDP nicht richtig/garnicht übertragen werden.
Aber hier im RDP in Notepad, da sieht es in den Druckereinstellungen gut aus und die Schächte werden ordentlich angezeigt, zumindestens die Quellen. Also die Schächte der Papierquellen sind OK, aber was die Ausgabeschächte betrifft, da kann ich nichts sagen, da es nur Einen gibt. DC_BINNAMES sollten aber die Quellen sein, somit wäre alles OK, im RDP. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz