Неверный вызов процедуры или аргумент при настройке объекта принтера

У меня есть приложение VB6, которое выдает ошибку 5, «Недопустимый вызов процедуры или аргумент», когда программа пытается установить объект «Принтер» на конкретный принтер из коллекции «Принтеры». Рассматриваемый принтер - это своего рода копировальный аппарат / принтер, работающий через сервер печати. Ошибка не возникает при установке объекта Printer для других принтеров, определенных в коллекции. Есть идеи, что может вызвать ошибку 5 в этом случае? Я не уверен, что именно происходит при использовании оператора «Set Printer = x» в VB6 - пытается ли он в этот момент взаимодействовать с фактическим драйвером принтера? Возможно ли, что драйвер по какой-либо причине не распознается как допустимый принтер объектом принтера VB6, что приводит к ошибке «недопустимый аргумент»?


person E Brown    schedule 10.04.2009    source источник
comment
Вы уверены, что ошибка находится в строке Set Printer? Я столкнулся с ошибками при установке различных свойств, которые не применимы к конкретному принтеру. Но не на заданной линии.   -  person Will Rickards    schedule 10.04.2009
comment
Да, это прямо в строке «Установить принтер». Источник пронумерован, а обработчик ошибок отображает значение Erl как часть сообщения об ошибке.   -  person E Brown    schedule 10.04.2009


Ответы (5)


«Неверный вызов процедуры или аргумент» относится к ошибке времени выполнения VB 5.

Я подозреваю, что ошибка 5, которую вы видите, является кодом ошибки Win32, что означает «Доступ запрещен».

Очевидно, ошибки времени выполнения VB отличаются от ошибок Win32 - я подозреваю, что это связано с корнями VB, предшествовавшим даже MS-DOS: http://blogs.msdn.com/ericlippert/archive/2004/09/09/227461.aspx. Я не уверен, как вы должны определять, какую интерпретацию использовать, когда

person Michael Burr    schedule 10.04.2009
comment
Ах ... никогда не думал об этом. Рассматриваемый принтер находится на сервере печати, но пользователь может печатать на нем с помощью других приложений. Что могло заставить VB6 получить отказ в доступе при попытке установить Printer = x? Требуются ли для настройки объекта «Принтер» права на конфигурацию целевого принтера или что-то в этом роде? - person E Brown; 10.04.2009
comment
Если пользователь может получить доступ к принтеру вне программы, я менее склонен думать, что это может быть проблема с отказом в доступе. - person Michael Burr; 10.04.2009
comment
Ошибка 5 почти наверняка является ошибкой времени выполнения VB 5 Неверный вызов процедуры или аргумент. Вы не получите ошибки Win32 при выполнении оператора Set. Вы получаете ошибки Win32 от VB6 только при вызовах API с использованием оператора Declare, а затем вы должны обнаруживать их, просматривая свойство Err.LastDllError - person MarkJ; 16.08.2010

Вы используете такой код, чтобы установить его правильно? Не просто пытаетесь установить его строкой?

   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
person Will Rickards    schedule 10.04.2009
comment
Да, приложение устанавливает объект «Принтер» как объект «Принтер» из коллекции «Принтеры». Он устанавливает «Принтер» на принтер чеков, распечатывает чек, а затем снова устанавливает «Принтер» на принтер Win по умолчанию. Если это копировальный аппарат, возникает ошибка. Если принтером по умолчанию не является копировальный аппарат, ошибки не возникает. - person E Brown; 10.04.2009
comment
см. мой измененный ответ - использование Printer.TrackDefault = False, чтобы избежать изменения принтера по умолчанию и, таким образом, избежать необходимости устанавливать его обратно. - person Will Rickards; 10.04.2009

Я решил эту проблему в MS Access 2007 VBA, включив имя сервера вместе с именем принтера.

Application.Printer = Application.Printers("\\servername\printername")

вместо того

Application.Printer = Application.Printers("printername")

Надеюсь, это поможет кому-то другому.

person Paul    schedule 16.08.2010

Я получал эту ошибку и после нескольких часов разочарования нашел свой ответ. Это вопрос чувствительный к регистру. У меня была заглавная буква «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)

presto это сработало

person Tbair8    schedule 22.04.2014

Вы можете взглянуть на следующую страницу:

http://support.microsoft.com/kb/322710

При печати в VB6 я всегда использую это диалоговое окно вместо обычного диалогового окна, которое поставляется с VB6. Это намного надежнее.

person Keith Maurino    schedule 14.04.2009