Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Duplexmodus des Druckers auslesen

Mitglied: eraser251105

eraser251105 (Level 1) - Jetzt verbinden

22.07.2011 um 11:04 Uhr, 6136 Aufrufe, 7 Kommentare

Hallo Gemeinde,

ich suche einen Weg, um den genauen Duplexmodus des Druckers auszulesen. Den Artikel von MS funktioniert leider nur bedingt.

Wir nutzen den API Call:

Private Declare Function SetPrinter Lib "winspool.drv" Alias _
"SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
pPrinter As Byte, ByVal Command As Long) As Long

um den entsprechenden Modus zu setzen. (Bis Windows XP)
Da wir aber jetzt auf Windows 7 64Bit migrieren wollen, funktioniert dieser API Call nicht mehr sauber und setzt den Duplexmodus
bei 1 von 10 Dokumenten falsch.

Deswegen habe ich versucht das ganze über einen virtuellen Drucker zu machen, der eine Duplexeinheit besitzt. Ich habe mir hier
lokal 3 Dateien angelegt (simplex, duplexShortSide, duplexLongSide), die ich während der Laufzeit per RunDll32 laufen lasse und
dann dementsprechend den Modus ändere. Das funktioniert soweit. Nur wenn man mehrere Dokumente mit einmal ausdruckt und
während der Laufzeit den Modus ändert, habe ich das Gefühl, das unser Word das so schnell nicht mitbekommt, dass sich der Modus
des Druckers geändert hat.

Nun meine Frage:
Gibt es einen Weg (über WMI) außer bei W32_Printer die Eigenschaft "duplex", den ich nutzen kann, um beim aktiven Drucker den aktuellen
Duplexmodus herauszufinden. Also wie gesagt, die API Calls unter Win7 laufen nicht 100%.

Danke vorab für eure Antworten.
Mitglied: Softprogger
22.07.2011 um 11:55 Uhr
Hallo Eraser,

mit der SetPrinter-Api hat das keinen Erfolg.
Stattdessen muß die Documentproperties-Api verwendet werden. Das ist zwar aufwendiger, geht dafür aber zu 100%

Dazu
1. mit OpenPrinter ein Handle auf den Drucker besorgen
2. mit Documentproperties den Devmode holen
3. aus der Devmode-Structure dmDuplex lesen ---> momentaner Duplexmodus
4. mit ClosePrinter das Druckerhandle schliessen

Soll der Duplexstatus geändert werden:
1. mit OpenPrinter ein Handle auf den Drucker besorgen
2. mit Documentproperties den Devmode holen
3. den ermittelten Devmode in eine leere Devmodestructure kopieren (also nur den öffentlichen Devmode-Bereich erfassen)
4. darin den gewünschten Duplexmode in dmDuplex setzen
5. in dmFlags das Bit DM_Duplex setzen
6. den Devmode zurückkopieren
7. Documentproperties mit DM_INBUFFER OR DM_OUTBUFFER aufrufen
8. ggfs. ResetDC aufrufen
9. mit ClosePrinter das Druckerhandle schliessen

Hoffe das hilft Dir weiter

Gruß Softprogger

3. aus der Devmode-Structure dmDuplex lesen ---> momentaner Duplexmodus
Bitte warten ..
Mitglied: eraser251105
22.07.2011 um 13:04 Uhr
hi softprogger,

probier das heute mal aus und schreib dir dann, ob das geklappt hat.
Hast du auch negative Erfahrungen mit einigen API Calls unter Win7?
gruss
Bitte warten ..
Mitglied: eraser251105
22.07.2011 um 13:52 Uhr
hi softprogger,

also ich habe das jetzt mal probiert und es funktioniert leider immer noch nicht zu 100%.

Ich nutze in VB6 folgende Schleife zum erzeugen der Dokumente:

Dim WordApp As Object
Dim doc As Object

Set WordApp = CreateObject("word.application")
Set doc = WordApp.Documents.Add
doc.range.Text = "Seite 1"

For I = 1 To 30
SetSimplex
WarteBisGesetztIst 1
doc.PrintOut False, , , Environ$("temp") & "\simplex" & CStr(I) & ".prn", printtofile:=True, collate:=True

SetLongSide
WarteBisGesetztIst 2
Call doc.PrintOut(False, , , Environ$("temp") & "\duplexLongSide" & CStr(I) & ".prn", printtofile:=True, collate:=True)

SetShortSide
WarteBisGesetztIst 3
Call doc.PrintOut(False, , , Environ$("temp") & "\duplexShortSide" & CStr(I) & ".prn", printtofile:=True, collate:=True)
Next
Debug.Print Timer
MsgBox "Fertig"


Funktion zum Setzen des Modus
Sub SetSimplex()
ShellAndWait "rundll32 printui.dll,PrintUIEntry /Sr /n " & """BKF-Drucker""" & " /a " & """C:\logfiles\simplex.dat""" & " u", vbHide
End Sub



Private Function WarteBisGesetztIst(ByVal v_Duplex As Byte)
Dim t0 As Single 'für den Timer
Dim nSecond As Integer
Dim o As Object
Dim Backup As Long
'Timer setzen und max. 10sek warten bis Simplex gesetzt ist
t0 = Timer
nSecond = 10
Do While Timer - t0 < nSecond
If GetPrinterDuplex(Printer.DeviceName, Printer.hdc) = v_Duplex Then Exit Do
Debug.Print "Noch nicht gesetzt"
DoEvents
' If we cross midnight, back up one day
If Timer < t0 Then
t0 = t0 - 24 * 60 * 60 ' or t0 = t0 - 86400
End If
Loop
Set o = Nothing

End Function



Wobei ich mit "GetPrinterDuplex" mir mit deinen Tip (Documentsproperties) den Duplexmodus hole.
Hast du einen weiteren Tip für mich?
gruss
eraser
Bitte warten ..
Mitglied: Softprogger
22.07.2011 um 14:24 Uhr
Hi Eraser,

ich kann zwar keinen API-Code sehen, aber ich denke es fehlt das Resetten des PrinterDC's.
also nach dem Setzen der Dokumentproperties noch ResetDC(Handle,pDevmode), sonst verbleibt der Drucker auf seinem vohergehenden Status.
(In VB ist das Printerhandle fast immer offen!)

Diese Problematik betrifft nicht nur Windows7 (wobei es da hauptsächlich Pointerprobleme gibt...).
Früher habe ich auch mal solche Experimente unter VB6 gemacht. Dadurch bin ich mehr und mehr zu dem Stand gekommen, dass VB6 für das GUI einer App ganz interessant ist, aber wenn es ans 'Eingemachte' geht, sollte schon wegen der Performance mit den API's jongliert werden, und das nach Möglichkeit in einer eigenstämdigem DLL.
VB-Net hat sicherlich mehr Möglichkeiten, verliert aber noch mehr Performance, da über das Framework letztendlich auch nur API's über einen Wrapper zum Tragen kommen. So wird der Zuwachs an Hardwarepower oft schneller verheizt als man denkt.
Als Programmierer, der mit DOS und seinen beschränkten (Hardware-)Möglichkeiten groß geworden ist, tut es manchmal einfach weh, wie unachtsam mit Resourcen umgegangen wird.

Gruß
Softprogger
Bitte warten ..
Mitglied: eraser251105
22.07.2011 um 16:28 Uhr
hi,
probier ich aus...
danke erstmal für deine Mühe...
gruss
eraser
Bitte warten ..
Mitglied: eraser251105
25.07.2011 um 09:24 Uhr
Hi Softprogger,

ich habe es mal getestet mit folgenden Ergebnis.
Unter Windows XP werden 270 Dokumente sauber erzeugt. Ich habe ein Prüfroutine geschrieben, die jede einzelne Datei öffnet und schaut, ob die Druckdatei sauber mit dem
richtigen Modus erzeugt wurde (also bei Simplex=Duplex none, bei DuplexLongSide= Duplex NoTumple, bei DuplexShortSide=Duplex Tumble).
Da sind 270 prn Datei unter XP sauber erzeugt wurde.

Gleicher Vorgang unter Win7. Dateien werden erzeugt, dann gescannt und 160 Dateien sind fehlerhaft.

Hast du noch nen Tip?

Also, wie gesagt, ich brauche nur einen sauberen API Call, der mir den aktuellen Modus des virtuellen Drucker zurückgibt. Das Setzen läuft bei mir über die Dateien.
Gruss Eraser
Bitte warten ..
Mitglied: eraser251105
25.07.2011 um 15:02 Uhr
Hi Softprogger,

ich denke, ich habe den Fehler jetzt eingegrenzt. Und zwar habe ich 2 verschiedene Office Versionen.
Office 2007 und Office 2010.

Beim System Windows XP --> Office 2007 funktioniert alles
Beim System Windows 7 --> Office 2007 funktioniert alles
Beim System Windows 7 --> Office 2010 funktioniert es nicht.

Jetzt habe ich mal geschaut, was die Unterschiede sind. Und zwar folgendes. Man hat bis Office 2007 nur die Möglichkeit beim Drucker
systemweit die Einstellungen zu setzen und diese Einstellungen gelten für alle Dokumente in der Word-Instanz, wobei die Druckereinstellungen
in Word 2010 (Office 2010) jeweils für das einzelne Dokument ist, dass heißt, dass unabhängig von der Systemeinstellungen des Druckers hier der DuplexModus für jedes einzelne
Dokument gesetzt werden kann. Das ist zwar, finde ich, eine Weiterentwicklung in Office, nur funktioniert deswegen unser Drucksystem nicht mehr.

Jetzt muss ich eine programmatische Lösung finden, um diese Duplexeinstellungen zur Laufzeit zu ändern.
Kennst du dich da aus?
gruss Eraser
Bitte warten ..
Ähnliche Inhalte
Drucker und Scanner

Druckereinstellungen eines gesharten Druckers werden auf den Clients nicht übernommen.

Frage von PhtevenDrucker und Scanner1 Kommentar

Hallo Wissende. Ich habe ein kleines Problem und zwar folgendes: Ich habe einen Windows Server 2012 R2 auf dem ...

Drucker und Scanner

Den öffentlichen Benutzer eines Druckers auf der Weboberfläche sperren

gelöst Frage von SnvRCalleDrucker und Scanner2 Kommentare

Heyho, wir haben vor kurzen im der Firma neue Drucker erhalten. Nun nachdem schon sämtliche Konfigurationen vorgenommen wurden, wollte ...

VB for Applications

Per VBA die Papierfächer eines Druckers zuweisen

gelöst Frage von beidermachtvongreyscullVB for Applications4 Kommentare

Hallo liebe Kolleginnen und Kollegen, ich habe ein Word-Macro gebaut, welches eine vom Nutzer festgelegte Anzahl an Drucken entsprechend ...

Drucker und Scanner

Windows10: 2x installation des gleichen Druckers mit unterschiedlichen Parametern

Frage von mertaufmbergDrucker und Scanner3 Kommentare

Einen schönen Guten Morgen, ich stehe vor der Aufgabe einen Etikettendrucker (AP 5.4 300DPI von Avery) mit 2 Formaten ...

Neue Wissensbeiträge
E-Mail
Email-Apps und Verhalten bei Pop3
Erfahrungsbericht von kfranzk vor 4 StundenE-Mail3 Kommentare

Hallo Freunde, da mir mein diesbezüglicher Faden als gelöst markiert wurde, muss ich hier neu aufsetzen. Ich arbeite bewusst ...

Hyper-V

Optimiertes Ubuntu per Microsoft Hyper-V-Schnellerstellung verfügbar

Anleitung von Frank vor 5 StundenHyper-V

Für Microsofts Virtualisierungssoftware Hyper-V ist ab sofort auch ein optimiertes Ubuntu 18.04.1 LTS verfügbar. In der "Hyper-V-Schnellerstellung" App, die ...

Sicherheits-Tools

Trend Micro WorryFree Business Security (WFBS) 10 - neuer Patch 1470 verfügbar

Tipp von VGem-e vor 9 StundenSicherheits-Tools

Servus, mal sehen, ob mit Patch 1470, zu finden unter dann die angeblich fehlerhafte Funktion, die unter W10 im ...

Server-Hardware

Lösung für Ersatz eines defekter Raid-Controllers

Anleitung von wellknown vor 23 StundenServer-Hardware3 Kommentare

Hallo, da ich nichts gefunden habe und selbst eine Lösung brauchte, hier eine kleine Anleitung für alle die vor ...

Heiß diskutierte Inhalte
Windows Server
Mit der alten Domäneprofil anmelden ohne Server
gelöst Frage von SyosseWindows Server37 Kommentare

Hallo Jungs Folgendes Szenario: Ich habe bei einem sehr kleinen Unternehmen (2Personen) den Server migriert, soweit hat alles geklappt. ...

Sicherheits-Tools
Virenprogramm lässt Programme nicht starten
Frage von SurferGirlSicherheits-Tools23 Kommentare

Hallo, ich bin neu hier, ich hoffe ich habe die richtige Rubrik gewählt. Falls nicht, tut es mir leid. ...

Windows Server
Kann DNS-Einträge nicht finden
gelöst Frage von BPeterWindows Server19 Kommentare

Hallo, wenn ich folgenden Befehl absetze, bekomme ich eine Liste zurück mit allen Einträgen der DNS-Zone. Wenn ich aber ...

Windows Server
SQL Server Instanz (Eplan) auf WIN 2008 RC2 Server frisst RAM ohne Limit
Frage von derinderinderinWindows Server17 Kommentare

Hallo Zusammen, Wir haben hier einen Windows 2008 RC2 Server. Darauf läuft ein SQL Server Express 2014 Version 12.0.4232.0. ...