Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
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 * CCHFORMNAME
dmLogPixels As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
dmICMMethod As Long ' // Windows 95 only
dmICMIntent As Long ' // Windows 95 only
dmMediaType As Long ' // Windows 95 only
dmDitherType As Long ' // Windows 95 only
dmReserved1 As Long ' // Windows 95 only
dmReserved2 As Long ' // Windows 95 only
End TypePublic Sub SetOrientationOrPageSize(ByVal dwOwnHwnd As Long, chng As tagToward, ByVal vPageSize As PrinterObjectConstants)
Dim PrinterHandle As Long
Dim PrinterName As String
Dim pd As PRINTER_DEFAULTS
Dim MyDevMode As DEVMODE
Dim Result As Long
Dim Needed As Long
Dim pFullDevMode As Long
Dim pi2_buffer() As Long ' // This is a block of memory for the Printer_Info_2 structure
PrinterName = Printer.DeviceName
If PrinterName = "" Then
Exit Sub
End If
On Error Resume Next
pd.pDatatype = vbNullString
pd.pDevMode = 0&
pd.DesiredAccess = PRINTER_ALL_ACCESS
Result = OpenPrinter(PrinterName, PrinterHandle, pd)
Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
ReDim pi2_buffer((Needed \ 4))
Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
pFullDevMode = pi2_buffer(7)
Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
MyDevMode.dmDuplex = DMDUP_SIMPLEX
MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION Or DM_PAPERSIZE
MyDevMode.dmOrientation = chng
MyDevMode.dmPaperSize = vPageSize
Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
Result = DocumentProperties(dwOwnHwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
Call ClosePrinter(PrinterHandle)
Dim P As Printer
For Each P In Printers
If P.DeviceName = PrinterName Then
Set Printer = P
Exit For
End If
Next P
Printer.Duplex = MyDevMode.dmDuplex
End Sub
一運行到 Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))程序就自動退出,試了其它的程序(在別的2000SP4系統上能正常運行)也是一樣的,系統是2000的SP4,請問是不是有什麼系統組沒有裝好,
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
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 * CCHFORMNAME
dmLogPixels As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
dmICMMethod As Long ' // Windows 95 only
dmICMIntent As Long ' // Windows 95 only
dmMediaType As Long ' // Windows 95 only
dmDitherType As Long ' // Windows 95 only
dmReserved1 As Long ' // Windows 95 only
dmReserved2 As Long ' // Windows 95 only
End TypePublic Sub SetOrientationOrPageSize(ByVal dwOwnHwnd As Long, chng As tagToward, ByVal vPageSize As PrinterObjectConstants)
Dim PrinterHandle As Long
Dim PrinterName As String
Dim pd As PRINTER_DEFAULTS
Dim MyDevMode As DEVMODE
Dim Result As Long
Dim Needed As Long
Dim pFullDevMode As Long
Dim pi2_buffer() As Long ' // This is a block of memory for the Printer_Info_2 structure
PrinterName = Printer.DeviceName
If PrinterName = "" Then
Exit Sub
End If
On Error Resume Next
pd.pDatatype = vbNullString
pd.pDevMode = 0&
pd.DesiredAccess = PRINTER_ALL_ACCESS
Result = OpenPrinter(PrinterName, PrinterHandle, pd)
Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
ReDim pi2_buffer((Needed \ 4))
Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
pFullDevMode = pi2_buffer(7)
Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
MyDevMode.dmDuplex = DMDUP_SIMPLEX
MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION Or DM_PAPERSIZE
MyDevMode.dmOrientation = chng
MyDevMode.dmPaperSize = vPageSize
Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
Result = DocumentProperties(dwOwnHwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
Call ClosePrinter(PrinterHandle)
Dim P As Printer
For Each P In Printers
If P.DeviceName = PrinterName Then
Set Printer = P
Exit For
End If
Next P
Printer.Duplex = MyDevMode.dmDuplex
End Sub
一運行到 Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))程序就自動退出,試了其它的程序(在別的2000SP4系統上能正常運行)也是一樣的,系統是2000的SP4,請問是不是有什麼系統組沒有裝好,
解决方案 »
- VB中有字符串流的概念吗?
- 新手问题: DLL里多个类之间函数调用问题
- vb6生成的exe文件的version属性product name怎么在程序中修改?
- 何谓系统缺省码页?(无分求教)
- accsee里的空记录,取出来,放在MSFlexGrid里。调试时,老是有这个错误,实时错误‘94’无效使用 NULL。各位帮帮忙了。
- Winsock如何将图片发送到客户端的浏览器呢???HELP!!急!!!在线等!!
- 请教一个程序速度的问题
- 怎样判断字符串是hh:ss时间格式,谢谢啦
- 研究QQ的实现原理!
- vb程序启动时如何才能清除屏幕背景?
- 如何用vb修改excel表中的内容
- 集合对象中,类的事件如何触发
这句执行后所返回的Result是不是0,如果是0的话,那就是GetPrinter函数没有调用成功。你可以在Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed) 后面加上个Debug.Print Err.LastDllError,看看是什么错误
pFullDevMode = VarPtr(pi2_buffer(7))
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
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 * CCHFORMNAME
dmLogPixels As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
dmICMMethod As Long ' // Windows 95 only
dmICMIntent As Long ' // Windows 95 only
dmMediaType As Long ' // Windows 95 only
dmDitherType As Long ' // Windows 95 only
dmReserved1 As Long ' // Windows 95 only
dmReserved2 As Long ' // Windows 95 only
End TypePublic Sub SetOrientationOrPageSize(ByVal dwOwnHwnd As Long, chng As tagToward, ByVal vPageSize As PrinterObjectConstants)
Dim PrinterHandle As Long
Dim PrinterName As String
Dim pd As PRINTER_DEFAULTS
Dim MyDevMode As DEVMODE
Dim Result As Long
Dim Needed As Long
Dim pFullDevMode As Long
Dim pi2_buffer() As Long ' // This is a block of memory for the Printer_Info_2 structure
PrinterName = Printer.DeviceName
If PrinterName = "" Then
Exit Sub
End If
On Error Resume Next
pd.pDatatype = vbNullString
pd.pDevMode = 0&
pd.DesiredAccess = PRINTER_ALL_ACCESS
Result = OpenPrinter(PrinterName, PrinterHandle, pd)
Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
ReDim pi2_buffer((Needed \ 4))
Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
pFullDevMode = VarPtr(pi2_buffer(7))
Call CopyMemory(VarPtr(MyDevMode), ByVal pFullDevMode, Len(MyDevMode))
MyDevMode.dmDuplex = DMDUP_SIMPLEX
MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION Or DM_PAPERSIZE
MyDevMode.dmOrientation = chng
MyDevMode.dmPaperSize = vPageSize
Call CopyMemory(ByVal pFullDevMode, VarPtr(MyDevMode), Len(MyDevMode))
Result = DocumentProperties(dwOwnHwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
Call ClosePrinter(PrinterHandle)
Dim P As Printer
For Each P In Printers
If P.DeviceName = PrinterName Then
Set Printer = P
Exit For
End If
Next P
Printer.Duplex = MyDevMode.dmDuplex
End Sub
试下.结合了上面的方案
楼上的朋友 换成NTAPI试试