probleem met duplex/simplex aansturen van netwerkprinters

Status
Niet open voor verdere reacties.

Hans12345

Nieuwe gebruiker
Lid geworden
26 sep 2007
Berichten
2
Hallo,

Ik gebruik een default methode voor aansturen van de printerproperties vanuit word met vba, middels winspool.ddl.
de code staat onder in dit bericht.
een aantal functies worden uitgevoerd en verlopen goed totdat de nieuwe printerproperties weggeschreven worden naar de defaultprinter (netwerk) middels:


nRet = SetPrinter(hPrinter, 2, yPInfoMemory(0), 0)
If (nRet = 0) Then
MsgBox "Unable to set shared printer settings."
End If


Hieruit blijkt dat ik niet de juiste rechten heb de netwerkprinter-properties te setten.
Alhoewel dit raar is omdat ik wel handmatig deze properties (onder andere duplex) kan instellen.

Ik krijg dus de melding: "Unable to set shared printer settings."

Iemand suggesties of ervaring met dit probleem???


ps: ik heb al gestoeid met PRINTER_INFO, PRINTER_ACCESS_ADMINISTER etc.

--------------------------------------------------------------------------------------------------------------------------
'Option Explicit
'Public testwaarde As Boolean
' Public Type PRINTER_DEFAULTS
'
' pDatatype As Long
' pDevmode As Long
' DesiredAccess As Long
' End Type
'
' Public Type PRINTER_INFO_2
' pServerName As Long
' pPrinterName As Long
' pShareName As Long
' pPortName As Long
' pDriverName As Long
' pComment As Long
' pLocation As Long
' pDevmode As Long ' Pointer to DEVMODE
' pSepFile As Long
' pPrintProcessor As Long
' pDatatype As Long
' pParameters As Long
' pSecurityDescriptor As Long ' Pointer to SECURITY_DESCRIPTOR
' Attributes As Long
'
'
' Priority As Long
' DefaultPriority As Long
' StartTime As Long
' UntilTime As Long
' Status As Long
' cJobs As Long
' AveragePPM As Long
' End Type
'
' Public Type DEVMODE
' dmDeviceName As String * 32
'
' dmSpecVersion As Integer
' dmDriverVersion As Integer
' dmSize As Integer
' dmDriverExtra As Integer
' dmFields As Long
' dmOrientation As Integer
' dmPaperSize As Integer
' dmPaperLength As Integer
' dmPaperWidth As Integer
' dmScale As Integer
' dmCopies As Integer
' dmDefaultSource As Integer
' dmPrintQuality As Integer
' dmColor As Integer
' dmDuplex As Integer
' dmYResolution As Integer
' dmTTOption As Integer
' dmCollate As Integer
' dmFormName As String * 32
' dmUnusedPadding As Integer
' dmBitsPerPel As Integer
' dmPelsWidth As Long
' dmPelsHeight As Long
' dmDisplayFlags As Long
' dmDisplayFrequency As Long
' dmICMMethod As Long
' dmICMIntent As Long
' dmMediaType As Long
' dmDitherType As Long
' dmReserved1 As Long
' dmReserved2 As Long
' End Type
'
' Public Type PRINTER_INFO_9
' pDevmode As Long ' Pointer to DEVMODE
' End Type
'
' Public Const DM_DUPLEX = &H1000&
' Public Const DM_IN_BUFFER = 8
'
' Public Const DM_OUT_BUFFER = 2
' Public Const PRINTER_ACCESS_ADMINISTER = &H4
' Public Const PRINTER_ACCESS_USE = &H8
' Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
' Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
' PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
'
' Public Declare Function ClosePrinter Lib "winspool.drv" _
' (ByVal hPrinter As Long) As Long
' Public Declare Function DocumentProperties Lib "winspool.drv" _
' Alias "DocumentPropertiesA" (ByVal hwnd As Long, _
' ByVal hPrinter As Long, ByVal pDeviceName As String, _
' ByVal pDevModeOutput As Long, ByVal pDevModeInput As Long, _
' ByVal fMode As Long) As Long
' Public Declare Function GetPrinter Lib "winspool.drv" Alias _
' "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
' pPrinter As Byte, ByVal cbBuf As Long, pcbNeeded As Long) As Long
' Public Declare Function OpenPrinter Lib "winspool.drv" Alias _
' "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
' pDefault As PRINTER_DEFAULTS) As Long
' Public 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
'
' Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
' (pDest As Any, pSource As Any, ByVal cbLength As Long)
'
'
'Public Declare Function GetLastError Lib "kernel32" () As Long
'
'Public Enum DuplexSetting
' dsSimplex = 0
' dsDuplexLongEdge = 1
' dsDuplexShortEdge = 2
'End Enum
' ' ==================================================================
' ' SetPrinterDuplex
' '
' ' Programmatically set the Duplex flag for the specified printer
' ' driver's default properties.
' '
' ' Returns: True on success, False on error. (An error will also
'
' ' display a message box. This is done for informational value
' ' only. You should modify the code to support better error
' ' handling in your production application.)
' '
' ' Parameters:
' ' sPrinterName - The name of the printer to be used.
' '
' ' nDuplexSetting - One of the following standard settings:
' ' 1 = None
' ' 2 = Duplex on long edge (book)
' ' 3 = Duplex on short edge (legal)
' '
' ' ==================================================================
' Public Function SetGetPrinterDuplex(ByRef lPrevDuplexSetting As DuplexSetting, _
' Optional sPrinterName As String, _
' Optional nDuplexSetting As DuplexSetting, _
' Optional bSet As Boolean, _
' Optional sErrMsg As String) As Boolean
'
' Dim hPrinter As Long
' Dim pd As PRINTER_DEFAULTS
' Dim pinfo As PRINTER_INFO_2
' Dim dm As DEVMODE
'
' Dim yDevModeData() As Byte
' Dim yPInfoMemory() As Byte
' Dim nBytesNeeded As Long
' Dim nRet As Long, nJunk As Long
' Dim iFirstRight As Integer
' Dim i As Integer
'
' On Error GoTo cleanup
'
' If (nDuplexSetting < dsSimplex) Or (nDuplexSetting > dsDuplexLongEdge) Then
' sErrMsg = "Error: dwDuplexSetting is incorrect."
' Exit Function
' End If
'
' If Len(sPrinterName) = 0 Then
' sPrinterName = ActivePrinter
' sPrinterName = Trim$(Left$(ActivePrinter, _
' InStr(ActivePrinter, " on ")))
'
' If InStr(1, sPrinterName, " on ", vbTextCompare) > 0 Then
' sPrinterName = Trim(Mid(sPrinterName, 1, InStr(1, sPrinterName, " on ", vbTextCompare)))
' End If
'
' End If
' pd.DesiredAccess = PRINTER_ACCESS_USE
' sPrinterName = sPrinterName & Chr(0)
' nRet = OpenPrinter(sPrinterName, hPrinter, pd)
' If (nRet = 0) Or (hPrinter = 0) Then
' If Err.LastDllError = 5 Then
' sErrMsg = "Access denied -- See the article for more"
' Else
' sErrMsg = "Cannot open the printer specified " & _
' "(make sure the printer name is correct)."
' End If
' Exit Function
' End If
'
' nRet = DocumentProperties(0, hPrinter, sPrinterName, 0, 0, 0)
' If (nRet < 0) Then
' sErrMsg = "Cannot get the size of the DEVMODE structure."
' GoTo cleanup
' End If
'
' ReDim yDevModeData(nRet + 100) As Byte
' nRet = DocumentProperties(0, hPrinter, sPrinterName, _
' VarPtr(yDevModeData(0)), 0, DM_OUT_BUFFER)
' If (nRet < 0) Then
' sErrMsg = "Cannot get the DEVMODE structure."
' GoTo cleanup
' End If
'
' Call CopyMemory(dm, yDevModeData(0), Len(dm))
'
' If Not CBool(dm.dmFields And DM_DUPLEX) Then
' sErrMsg = "You cannot modify the duplex flag for this printer" & _
' "because it does not support duplex or the driver " & _
' "does not support setting it from the Windows API."
' GoTo cleanup
' End If
'
' lPrevDuplexSetting = dm.dmDuplex
' dm.dmDuplex = nDuplexSetting
' If Not bSet Then
' GoTo cleanup
' End If
'
' Call CopyMemory(yDevModeData(0), dm, Len(dm))
'
' nRet = DocumentProperties(0, hPrinter, sPrinterName, _
' VarPtr(yDevModeData(0)), VarPtr(yDevModeData(0)), _
' DM_IN_BUFFER Or DM_OUT_BUFFER)
'
' If (nRet < 0) Then
' sErrMsg = "Unable to set duplex setting to this printer."
' GoTo cleanup
' End If
'
' Call GetPrinter(hPrinter, 2, 0, 0, nBytesNeeded)
' If (nBytesNeeded = 0) Then GoTo cleanup
'
' ReDim yPInfoMemory(nBytesNeeded + 100) As Byte
'
' nRet = GetPrinter(hPrinter, 2, yPInfoMemory(0), nBytesNeeded, nJunk)
' If (nRet = 0) Then
' sErrMsg = "Unable to get shared printer settings."
' GoTo cleanup
' End If
'
' Call CopyMemory(pinfo, yPInfoMemory(0), Len(pinfo))
' pinfo.pDevmode = VarPtr(yDevModeData(0))
' 'pinfo.PI. .pSecurityDescriptor = 0
' Call CopyMemory(yPInfoMemory(0), pinfo, Len(pinfo))
'
' nRet = SetPrinter(hPrinter, 2, yPInfoMemory(0), 0)
' If (nRet = 0) Then
' sErrMsg = "Unable to set shared printer settings. " & GetLastError
' End If
'
'
' SetGetPrinterDuplex = CBool(nRet)
'
'cleanup:
' If (hPrinter <> 0) Then Call ClosePrinter(hPrinter)
'
' End Function
'
'Public Sub zetten_simplex()
' SetGetPrinterDuplex dsSimplex, "", dsDuplexLongEdge, True
''MsgBox ("simplex " + testwaarde)
'End Sub
'
'Public Sub zetten_duplex()
'Dim sErrMsg As String
' testwaarde = SetGetPrinterDuplex(dsDuplexLongEdge, "", dsSimplex, True, sErrMsg = "ok")
'MsgBox ("duplex " + sErrMsg)
'End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan