设置打印机对象时出现“无效的过程调用或参数”

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 数组时出现问题

打印凭证时出现“未知错误(错误号:-107)”是怎么回事啊

打印 json 对象时出现意外的令牌 L 使用高级休息 chrome

打印条码标签时出现打印机无效 ,但是打印别的又是没有问题的求解

电子图版打印时出错误报告

打印时出现 GhostScript 图像质量问题