Standarddrucker unter Win7 ermitteln

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Standarddrucker unter Win7 ermitteln

Beitrag 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
+
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag von Tom »

Bei mir liefert dieser Code unter Windows 7 und Windows 8 den Standarddrucker. Gegenfrage: Gibt es überhaupt einen?
Herzlich,
Tom
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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...
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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')
Viele Grüße
Wolfgang
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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.
Viele Grüße
Wolfgang
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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
Gruß
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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)
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag von Wolfgang Ciriack »

Ok, danke, dann habe ich jetzt Alternativen zum Testen.
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Standarddrucker unter Win7 ermitteln

Beitrag 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))
Viele Grüße
Wolfgang
Antworten