设置打印机对象时出现“无效的过程调用或参数”
Posted
技术标签:
【中文标题】设置打印机对象时出现“无效的过程调用或参数”【英文标题】:"Invalid procedure call or argument" when setting Printer object 【发布时间】:2009-04-10 14:03:33 【问题描述】:当程序尝试将 Printer 对象设置为 Printers 集合中的特定打印机时,我有一个 VB6 应用程序给出错误 5“无效的过程调用或参数”。有问题的打印机是某种通过打印服务器运行的复印机/打印机。将 Printer 对象设置为集合中定义的其他打印机时,不会发生该错误。在这种情况下可能导致错误 5 的任何想法?我不确定在 VB6 中使用“Set Printer = x”语句时究竟会发生什么——它是否正在尝试与实际的打印机驱动程序交互?是不是因为某种原因驱动没有被VB6 Printer对象识别为有效的打印机,导致“invalid argument”错误?
【问题讨论】:
您确定错误出在设置打印机行吗?我在设置不适用于特定打印机的不同属性时遇到了错误。但不在片场。 是的,它就在“设置打印机”行。源是行号的,错误处理程序将 Erl 值显示为错误消息的一部分。 【参考方案1】:“无效的过程调用或参数”是针对 VB 运行时错误 5。
我怀疑您看到的错误 5 是 Win32 错误代码,意思是“访问被拒绝”。
显然 VB 运行时错误与 Win32 错误不同——我怀疑它与早于 MS-DOS 的 VB 的根源有关:http://blogs.msdn.com/ericlippert/archive/2004/09/09/227461.aspx。我不确定您应该如何确定何时使用哪种解释
【讨论】:
啊……没想到。有问题的打印机位于打印服务器上,但用户可以使用其他应用程序打印到它。尝试“设置打印机 = x”时,什么可能导致 VB6 获得“访问被拒绝”?设置打印机对象是否需要对目标打印机有一些配置权限? 如果用户可以在程序之外访问打印机,我不太倾向于认为这可能是访问被拒绝的问题。 错误 5 几乎可以肯定是 VB 运行时错误 5“无效的过程调用或参数”。执行Set
语句不会出现 Win32 错误。使用 Declare
语句进行 API 调用时,您只会从 VB6 得到 Win32 错误,然后您必须通过查看 Err.LastDllError
属性来检测它们【参考方案2】:
您正在使用这样的代码将其设置正确吗? 不只是尝试通过字符串设置吗?
Dim strDeviceName As String
Dim prnCurrent As Printer
For Each prnCurrent In Printers
If UCase$(prnCurrent.DeviceName) = strDeviceName Then
Set Printer = prnCurrent
Exit For
End If
Next prnCurrent
为了停止更改默认打印机,请在设置打印机之前运行此代码。这样您就不必重新设置默认打印机。这也使您的打印机选择对您的程序来说是独一无二的,这是大多数人想要的。
' deassociate printer object from default system printer
Printer.TrackDefault = False
【讨论】:
是的,应用程序将 Printer 对象设置为 Printers 集合中的 Printer 对象。它将打印机设置为收据打印机,打印收据,然后将打印机设置回 Win 默认打印机。如果那是复印机,则会发生错误。如果默认打印机不是复印机,则不会发生错误。 查看我修改后的答案 - 使用 Printer.TrackDefault = False 来避免更改默认打印机,从而避免重新设置它。【参考方案3】:我在 MS Access 2007 VBA 中通过包含服务器名称和打印机名称解决了这个问题。
Application.Printer = Application.Printers("\\servername\printername")
而不是
Application.Printer = Application.Printers("printername")
希望这对其他人有所帮助。
【讨论】:
【参考方案4】:我遇到了这个错误,经过几个小时的挫折后找到了答案。这是一个区分大小写的问题。我应该有一个大写的“S”,而我应该有一个小写的“s”。
所以当代码看起来像这样时:
XeroxReport = "\\Share\Red Xerox 430"
Set Application.Printer = Application.Printers(XeroxReport)
我会收到错误 5
但是当我把它改成:
XeroxReport = "\\share\Red Xerox 430"
Set Application.Printer = Application.Printers(XeroxReport)
一下子就成功了
【讨论】:
【参考方案5】:您可能想看看以下页面:
http://support.microsoft.com/kb/322710
每当在 VB6 中打印时,我总是使用此对话框而不是 VB6 附带的常用对话框。它要可靠得多。
【讨论】:
以上是关于设置打印机对象时出现“无效的过程调用或参数”的主要内容,如果未能解决你的问题,请参考以下文章
在 tableview 上的对象中打印 json 数组时出现问题
打印 json 对象时出现意外的令牌 L 使用高级休息 chrome