Drucker überprüfen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
RAaBe
Beiträge: 80
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Drucker überprüfen

Beitrag von RAaBe »

Hallo, ich habe da eine Procedure die abfragt, ob der Drucker auf Hoch- oder Querdruck eingestellt ist. Nur leider kommt es vor , das die Procedure bei einigen lokalen und immer bei Netzwerdruckern einen 'Invalid Memory Access' erzeugt.

Hier mal der Code:

Code: Alles auswählen

Procedure drucker_ueberpruefen() 
Dim DevIn.DEVMODE(0)  ; Druckausgabe
Dim DevOut.DEVMODE(0) ; Druckausgabe
STDPrinterName$ = Space(260)
GetPrivateProfileString_("WINDOWS","DEVICE","", @STDPrinterName$, 260, "Win.Ini")
STDPrinterName$ = StringField(STDPrinterName$, 1,",")

PrinterHandle.l = 0
OpenPrinter_(STDPrinterName$,@PrinterHandle.l,0)
DocumentProperties_(0,PrinterHandle,STDPrinterName$,DevIn(0),DevOut(0),#DM_OUT_BUFFER|#DM_IN_BUFFER)
ClosePrinter_(PrinterHandle)

If DevIn(0)\dmOrientation = 1
  MessageRequester("Druckereinstellung überprüfen!","Bei des Auswahl der Papierausrichtung muss Querformat ausgewählt werden!",0)
EndIf
EndProcedure
Der Fehler kommt bei dieser Zeile: DocumentProperties_(0,PrinterHandle,STDPrinterName$,DevIn(0),DevOut(0),#DM_OUT_BUFFER|#DM_IN_BUFFER)

Weiss da vielleicht einer oder eine, was man da machen kann?

MfG

RAaBe
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Kann dir leider auch nicht helfen aber bei mir funktionierts!

PB3.94+Canon ip Pixma 3000
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

In Win32.hlp :

LONG DocumentProperties(
HWND hWnd, // handle to window that displays dialog box
HANDLE hPrinter, // handle to printer object
LPTSTR pDeviceName, // pointer to device name
PDEVMODE pDevModeOutput, // pointer to modified device mode structure
PDEVMODE pDevModeInput, // pointer to original device mode structure
DWORD fMode // mode flag
);

If the fMode parameter is zero, the return value is the size of the buffer required to contain the printer driver initialization data.
Note that this buffer can be larger than a DEVMODE structure if the printer driver appends private data to the structure.

Ein Beispiel :

Code: Alles auswählen

...
  Buffersize.l = DocumentProperties_(0, PrinterHandle, ImprimanteParDefaut, 0, 0, 0)
  *DevBufferIn = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize)
  *DevBufferOut = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize)
  DocumentProperties_(0, PrinterHandle, ImprimanteParDefaut, *DevBufferIn, *DevBufferOut, #DM_OUT_BUFFER | #DM_IN_BUFFER)
...
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
RAaBe
Beiträge: 80
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Beitrag von RAaBe »

Danke GNOZAL, ist werde den Beispielcode mal testen.
Benutzeravatar
RAaBe
Beiträge: 80
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Beitrag von RAaBe »

Hallo, ich habe das Problem das ich meinen Code

Code: Alles auswählen

Procedure drucker_ueberpruefen()
Dim DevIn.DEVMODE(0)  ; Druckausgabe
Dim DevOut.DEVMODE(0) ; Druckausgabe
STDPrinterName$ = Space(260)
GetPrivateProfileString_("WINDOWS","DEVICE","", @STDPrinterName$, 260, "Win.Ini")
STDPrinterName$ = StringField(STDPrinterName$, 1,",")

PrinterHandle.l = 0
OpenPrinter_(STDPrinterName$,@PrinterHandle.l,0)
DocumentProperties_(0,PrinterHandle,STDPrinterName$,DevIn(0),DevOut(0),#DM_OUT_BUFFER|#DM_IN_BUFFER)
ClosePrinter_(PrinterHandle)

If DevIn(0)\dmOrientation = 1
  MessageRequester("Druckereinstellung überprüfen!","Bei des Auswahl der Papierausrichtung muss Querformat ausgewählt werden!",0)
EndIf
EndProcedure
und GNOZAL's Code

Code: Alles auswählen

  Buffersize.l = DocumentProperties_(0, PrinterHandle, ImprimanteParDefaut, 0, 0, 0)
  *DevBufferIn = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize)
  *DevBufferOut = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize)
  DocumentProperties_(0, PrinterHandle, ImprimanteParDefaut, *DevBufferIn, *DevBufferOut, #DM_OUT_BUFFER | #DM_IN_BUFFER) 
nicht zusammen basteln kann (mein Englisch reicht dafür nicht).

Kann mir da einer helfen?
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

A more complete example :

Code: Alles auswählen

...
      PrinterHandle.l = 0
      If OpenPrinter_(ImprimanteParDefaut, @PrinterHandle.l, 0) = 0
        MessageRequester("ERREUR", "OpenPrinter() : impression impossible !", #MB_ICONERROR)
        ProcedureReturn
      EndIf
      Buffersize.l = DocumentProperties_(0, PrinterHandle, ImprimanteParDefaut, 0, 0, 0)
      *DevBufferIn = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize)
      *DevBufferOut = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize)
      DocumentProperties_(0, PrinterHandle, ImprimanteParDefaut, *DevBufferIn, *DevBufferOut, #DM_OUT_BUFFER | #DM_IN_BUFFER)
      *PrinterParameters.DEVMODE = *DevBufferIn
      ClosePrinter_(PrinterHandle)
      ; Modifier paramètres
      *PrinterParameters\dmOrientation = 1 ; Orientation [1:Portrait;2:Paysage]
      *PrinterParameters\dmPaperSize = #DMPAPER_A4 ; Format A4
      ; Initialisation de l'impression  
      If GetVersion_() & $FF0000 ; Windows NT/XP
        lpszDriver.s = "WINSPOOL"
      Else ; Win 9x/Me
        lpszDriver = ""
      EndIf
      PrinterDC.l = CreateDC_(@lpszDriver, ImprimanteParDefaut, 0, *PrinterParameters) 
      GlobalFree_(*DevBufferIn)
      GlobalFree_(*DevBufferOut)
      If PrinterDC = 0
        MessageRequester("ERREUR", "CreateDC() : impression impossible !", #MB_ICONERROR)
        ProcedureReturn
      EndIf
      PrintersWidth = GetDeviceCaps_(PrinterDC, 8)
      PrintersHeight = GetDeviceCaps_(PrinterDC, 10)
...
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
RAaBe
Beiträge: 80
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Beitrag von RAaBe »

Danke GNOZAL, ich werde es mal testen!
Antworten