AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DeviceCapabilities(DC_BINNAMES) liefert -1
Thema durchsuchen
Ansicht
Themen-Optionen

DeviceCapabilities(DC_BINNAMES) liefert -1

Ein Thema von uligerhardt · begonnen am 5. Mär 2014 · letzter Beitrag vom 18. Mai 2021
Antwort Antwort
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#1

DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 5. Mär 2014, 16:42
Hallo zusammen!

In unserer Anwendung lesen wir Schächte des aktuellen Druckers aus. Das funktioniert (mittlerweile ) auch gut. Zur Feststellung der Anzahl rufen wir Count := DeviceCapabilities(PChar(SomeDevice), PChar(SomePort), DC_BINNAMES, nil, nil); auf. Das liefert nun bei einem unserer Kunden auf einem HP Deskjet 5400 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.
Uli Gerhardt
  Mit Zitat antworten Zitat
rwalper

Registriert seit: 6. Sep 2006
48 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 5. Mär 2014, 17:02
Hi,

setze ersteinmal unmittelbar vor dem Aufruf LastError zurück:

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.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#3

AW: DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 5. Mär 2014, 18:18
setze ersteinmal unmittelbar vor dem Aufruf LastError zurück:
Gute Idee. Danke!
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#4

AW: DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 5. Mär 2014, 20:07
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.

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:
Count := Max(DeviceCapabilities(PChar(SomeDevice), PChar(SomePort), DC_BINNAMES, nil, nil), 1);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Mär 2014 um 20:11 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 6. Mär 2014, 08:48
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.
Ralph
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#6

AW: DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 14. Mai 2021, 18:48
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?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 18. Mai 2021, 10:42
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#8

AW: DeviceCapabilities(DC_BINNAMES) liefert -1

  Alt 18. Mai 2021, 15:01
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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