Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DeviceCapabilities(DC_BINNAMES) liefert -1 (https://www.delphipraxis.net/179408-devicecapabilities-dc_binnames-liefert-1-a.html)

uligerhardt 5. Mär 2014 15:42

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:
Count := DeviceCapabilities(PChar(SomeDevice), PChar(SomePort), DC_BINNAMES, nil, nil);
auf. Das liefert nun bei einem unserer Kunden auf einem HP Deskjet 5400
Delphi-Quellcode:
Count = -1
zurück. Ich meine, der Doku zu entnehmen, dass das ein Fehlercode ist. Leider steht finde ich in der Doku nichts, ob ich z.B. GetLastError aufrufen kann/darf/soll. Testhalber hab ich ein
Delphi-Quellcode:
if Count < 0 then
  RaiseLastOSError;
eingebaut und kriege "Systemfehler. Code: 1722. Der RPC-Server ist nicht verfügbar."

Meine Fragen:
  1. Ist es überhaupt richtig, hier GetLastError/RaiseLastOSError aufzurufen?
  2. Könnt ihr mit der Fehlermeldung was anfangen? Google liefert Lösungen a la "Solange Treiber neu installieren, bis es geht.". Vielleicht wisst ihr was Konkreteres. :-)

rwalper 5. Mär 2014 16:02

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.

uligerhardt 5. Mär 2014 17:18

AW: DeviceCapabilities(DC_BINNAMES) liefert -1
 
Zitat:

Zitat von rwalper (Beitrag 1250763)
setze ersteinmal unmittelbar vor dem Aufruf LastError zurück:

Gute Idee. Danke!

himitsu 5. Mär 2014 19:07

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);

Jumpy 6. Mär 2014 07:48

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.

Blup 14. Mai 2021 17:48

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?

TiGü 18. Mai 2021 09:42

AW: DeviceCapabilities(DC_BINNAMES) liefert -1
 
Hast du es schon mit WMI versucht?

Delphi-Quellcode:
//-----------------------------------------------------------------------------------------------------
//     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.
Ergibt bei mir:

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

himitsu 18. Mai 2021 14:01

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 09:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz