Seite 1 von 1

Standarddrucker unter Win7 ermitteln

Verfasst: Fr, 01. Mär 2013 13:53
von peternmb
Hallo,

kann es sein, dass das Ermitteln des Standarddruckers unter Windows7 nicht mehr wie gewohnt funktioniert?

Diese kleine Beispiel-Funktion aus dem Forum liefert mir unter XP den richtighen Druckernamen, unter Win7 ist das Ergebnis "junk" - habe ich das irgendwann etwas verpasst?

Code: Alles auswählen

MsgBox("Standarddrucker: "+GetDefPrinter())

FUNCTION GetDefPrinter()
LOCAL oDefPrinter, cDevName
oDefPrinter := XbpPrinter():New()
oDefPrinter:Create('junk')
cDevName := oDefPrinter:devName
oDefPrinter:Destroy()
RETURN cDevName
+

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Fr, 01. Mär 2013 14:03
von Tom
Bei mir liefert dieser Code unter Windows 7 und Windows 8 den Standarddrucker. Gegenfrage: Gibt es überhaupt einen?

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Fr, 01. Mär 2013 14:17
von peternmb
Tom hat geschrieben:Bei mir liefert dieser Code unter Windows 7 und Windows 8 den Standarddrucker. Gegenfrage: Gibt es überhaupt einen?
JA, unter XP funktioniert es auch - unter Win8 muss ich es mal testen.

Ich habe es jetzt unter verschiedenen Systemen getestet:
XP-> OK
Win8 -> OK
Win7/64 -> OK
Win7/32 -> nicht OK

Unter Win7/32 habe ich es mit 2 verschiedenen Benutzern getestet, einmal als Admin. Es funktioniert bei beiden nicht.
Keine Ahnung ob es an meinem Win7 liegt oder das ein xBase-Problem ist (ich setzt noch die 1.90.331ein).
Anscheinend gibt es das Problem aber nicht nur bei mir, da ich einige Absturzmeldungen von meinen Programmen habe, wo kein Standard-Drucker gesetzt werden konnte. Ich habe dort nur geprüft ob Drucker da sind - das werde ich jetzt ändern.
Dann ist das Problem zwar immer noch nicht gelöst aber zumindest kein Absturz mehr...

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Mo, 29. Jun 2015 19:10
von Wolfgang Ciriack
Gibt es noch eine andere Methode, den Standard-Drucker zu ermitteln ?
Ich bekomme bei einem Kunden öfters
Interne Datenstruktur beschädigt
Operation: Create
bei der Zeile: oPrinter:create('junk')

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Mo, 29. Jun 2015 19:28
von Tom
GetDefaultPrinter:

https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Allerdings verwende ich auch oPrinter := XbpPrinter():New() mit der Folgezeile oPrinter:Create('junk') - ohne IDSC. Dieses 'junk' war ein Hilfskonstrukt, um einen leeren Device-Context zu erhalten, wenn es keinen Standarddrucker gibt. Es sollte eigentlich inzwischen auch ohne 'cDeviceName' gehen, sagt jedenfalls die Doku.

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Mo, 29. Jun 2015 19:30
von AUGE_OHR
Wolfgang Ciriack hat geschrieben:Gibt es noch eine andere Methode, den Standard-Drucker zu ermitteln ?
Ich bekomme bei einem Kunden öfters
Interne Datenstruktur beschädigt
Operation: Create
bei der Zeile: oPrinter:create('junk')
hm ... wenn ich

Code: Alles auswählen

LOCAL oPS, oDC := XbpPrinter():New() 

   aPrinter := oDC:list()
   IF LEN(aPrinter) > 0
      cPrinterObjectName := aPrinter[1]
      oDC:Create( cPrinterObjectName ) 
   ELSE
      Msgbox("no Printer installed")
      RETURN .F.
   ENDIF

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Mo, 29. Jun 2015 22:13
von Herbert
genau:
Ohne Felhlermeldung geht das dann so:

Code: Alles auswählen

LOCAL aPrinters[0], oPrn
oPrn := XbpPrinter():new()
AADD(aPrinters,'Kein Drucker')
IF oPrn # NIL  // Druckerobject wurde erzeugt.
  aPrinters := oPrn:list()
ENDIF

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Di, 30. Jun 2015 15:12
von Wolfgang Ciriack
@ Jimmy und Herbert,
eure Lösungen liefern mir aber nicht den Namen des Default-Druckers zurück, oder habe ich da was übersehen ?
Ich bezog mich hier auf die oben gepostete Funktion.

@Tom,
der Fehler tritt auch nicht immer an dieser Station auf, evtl. hängt es ja auch noch mit etwas anderem zusammen.
Ich werde mal versuchen, die Funktion aus der Winspool.lib zu verwenden.

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Di, 30. Jun 2015 15:55
von Koverhage
Ich benutze die Printerapi von Phil Ide dafür.
Siehe auch Post von Martin: http://www.xbaseforum.de/viewtopic.php?p=12740#p12740

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Di, 30. Jun 2015 16:37
von AUGE_OHR
Wolfgang Ciriack hat geschrieben:@ Jimmy und Herbert,
eure Lösungen liefern mir aber nicht den Namen des Default-Druckers zurück, oder habe ich da was übersehen ?
Ich bezog mich hier auf die oben gepostete Funktion.
hm ... ok du willst also das

Code: Alles auswählen

#include "DLL.CH"

PROCEDURE MAIN
   ? GetDefaultPrinter()
   WAIT
RETURN

DLLFUNCTION GetDefaultPrinterA(@pPrinter,@pwdBufferSize) USING OSAPI FROM WINSPOOL.DRV

Function GetDefaultPrinter()
   local cPrinter := Space(250)
   local pwdBufferSize := 250

   GetDefaultPrinterA(@cPrinter,@pwdBufferSize)
   Return (cPrinter)

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Di, 30. Jun 2015 17:08
von Werner_Bayern
Bei mir sieht das so aus:

Code: Alles auswählen

   if (cStandardDrucker := XbpPrinter():new():create():devName) == NIL
      cStandardDrucker := ""
   else
      cStandardDrucker := rtrim(cStandardDrucker)
   endif

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Di, 30. Jun 2015 17:45
von Wolfgang Ciriack
Ok, danke, dann habe ich jetzt Alternativen zum Testen.

Re: Standarddrucker unter Win7 ermitteln

Verfasst: Mi, 01. Jul 2015 9:23
von Wolfgang Ciriack
Habe jetzt mal Jimmys Funktion mit einer Rückgabewertänderung eingebaut:

Code: Alles auswählen

DLLFUNCTION GetDefaultPrinterA(@pPrinter,@pwdBufferSize) USING OSAPI FROM WINSPOOL.DRV

Function GetDefaultPrinter()
   local cPrinter := Space(250)
   local pwdBufferSize := 250

   GetDefaultPrinterA(@cPrinter,@pwdBufferSize)
   Return (substr(cPrinter,1,at(chr(0),cPrinter)-1))