CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

用代码设置打印机默认纸张时出现 内存不能为read,急盼解决!

楼主csdnweii(庸医)2006-07-01 12:50:40 在 VB / API 提问

我用下面的代码设置打印机的默认纸张的时候在执行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

相关问题

关键词

得分解答快速导航

  • 帖主:csdnweii
  • fcuandy
  • lyjyqx

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo