用代码设置打印机默认纸张时出现 内存不能为read,急盼解决!
我用下面的代码设置打印机的默认纸张的时候在执行CopyMemory 的时候,有的机器上可以成功,但更多的机器上出现"内存不能为read",更奇怪的是我在计算机A上设置打印机P1可以成功,但设置P2出错,在开发程序的计算机上设置P1和P2都没问题.请高手帮忙
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
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
dmUnusedPadding As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Private Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As DEVMODE
DesiredAccess As Long
End Type
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, buffer As Any, ByVal pbSize As Long, pbSizeNeeded As Long) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal Command As Long) As Long
Public Sub SetPrintDefault(ByVal FormName As String, PaperSize As Integer)
Dim SizeNeeded As Long, buffer() As Long
Dim pDef As PRINTER_DEFAULTS
Dim X As DEVMODE
Dim lret As Long
Dim mhPrinter As Long
Dim str As String
pDef.DesiredAccess = PRINTER_ALL_ACCESS
lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef)
ReDim Preserve buffer(0 To 0)
lret = GetPrinter(mhPrinter, 9, buffer(0), 0, SizeNeeded)
ReDim Preserve buffer(0 To (SizeNeeded / 4) + 3) As Long
lret = GetPrinter(mhPrinter, 9, buffer(0), UBound(buffer) * 4, SizeNeeded)
'*******************************************
CopyMemory X, ByVal buffer(0), Len(X)
'*******************************************
X.dmFields = &H10000 Or 2
X.dmFormName = FormName & vbNullChar
X.dmPaperSize = PaperSize
CopyMemory ByVal buffer(0), X, Len(X)
lret = SetPrinter(mhPrinter, 9, buffer(0), 0)
ClosePrinter mhPrinter
End Sub
问题点数:100、回复次数:7Top
1 楼ccs02287(☆兜兜里有糖☆偶滴兜兜里有糖,你和我玩不?)回复于 2006-07-01 22:19:22 得分 0
沙发……帮顶咯!
本人不才,不能帮上你Top
2 楼csdnweii(庸医)回复于 2006-07-02 11:32:04 得分 0
晕啊,我等了两天了,怎么没人回答啊?自己顶一下别沉了Top
3 楼fcuandy(了此残生.)回复于 2006-07-02 11:54:12 得分 50
這種情況不一定是你代碼引起的. 可能是由于系統的問題.
當然也可能是因為你的代碼無意中訪問了一些不應該訪問的內存.當某些內存被期其它程序占用時,你的程序寫東西(這個不一定是你可以控制的,因為VB在內存控制這方面比較吃力吧)進去就報錯了.
我們也經常碰到這種問題,當安裝過一個軟件後,執行其它東西或這個軟件後,系統會報這樣的錯誤.但系統重作之後,再裝這軟件可能就沒問題.或者換台機器也沒問題.
你可以試一下在其它機器上執行看看.
個人看法僅供參考Top
4 楼csdnweii(庸医)回复于 2006-07-02 12:22:34 得分 0
我在好几台机器上试了,有的可以有的不可以,其中有两台机器修改了端口设置(网络打印机)后就可以了,但其他的机器怎么改都不行.用VC做会不会有这样的问题呢?Top
5 楼sequh(夏克)回复于 2006-07-02 16:44:55 得分 0
帮你顶吧Top
6 楼loomman(一剑)回复于 2006-07-02 17:12:06 得分 0
建议用VC来实现,VC底层控制较好。Top
7 楼lyjyqx(学无止境)回复于 2006-07-05 15:07:56 得分 50
将 *******************************************
CopyMemory X, ByVal buffer(0), Len(X)
'*******************************************
改成:
dim yy as long
yy=varPtr(x)
CopyMemory yy, buffer(0), Len(X)
也可能是打印机驱动程序的事或者你可以重装打印机改革端口是以下。
可能是那块内存不能被read,但换个端口号可能行,以前我也遇到过
类似问题,改个端口号就行了。
Top




