Seite 1 von 1
Drucker überprüfen
Verfasst: 10.01.2006 20:52
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
Verfasst: 11.01.2006 00:24
von roherter
Kann dir leider auch nicht helfen aber bei mir funktionierts!
PB3.94+Canon ip Pixma 3000
Verfasst: 11.01.2006 10:12
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)
...
Verfasst: 12.01.2006 21:14
von RAaBe
Danke GNOZAL, ist werde den Beispielcode mal testen.
Verfasst: 15.01.2006 12:35
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?
Verfasst: 16.01.2006 10:37
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)
...
Verfasst: 16.01.2006 21:49
von RAaBe
Danke GNOZAL, ich werde es mal testen!