У меня есть приложение VB6, которое дает ошибку 5 «Неверный вызов или аргумент процедуры», когда программа пытается установить объект «Принтер» на определенный принтер из коллекции «Принтеры» , Принтер, о котором идет речь, представляет собой своего рода копир/принтер, работающий через сервер печати. Ошибка при установке объекта Printer на другие принтеры, определенные в коллекции. Любые идеи, которые могут вызвать ошибку 5 в этом случае? Я не уверен, что именно происходит при использовании инструкции «Установить принтер = x» в VB6 - пытается ли она взаимодействовать с фактическим драйвером принтера в этот момент? Возможно ли, что драйвер по какой-либо причине не был признан допустимым принтером объектом VB6 Printer, что привело к ошибке «неправильный аргумент»?«Неверный вызов или аргумент процедуры» при установке Объект принтера
ответ
«Неверные вызов процедуры или аргумент» для ошибки VB выполнения 5.
Я подозреваю, что ошибка 5 вы видите, код ошибки Win32, что означает «доступ запрещен».
Видимо, ошибки времени выполнения VB отличаются от ошибок Win32 - я подозреваю, что это связано с корнями VB, предшествующими даже MS-DOS: http://blogs.msdn.com/ericlippert/archive/2004/09/09/227461.aspx. Я не уверен, как вы должны определять, какую интерпретацию использовать, когда
Ах ... никогда не думал об этом. Принтер находится на сервере печати, но пользователь может печатать его с другими приложениями в порядке. Что может заставить VB6 получить «Access denied» при попытке «Установить принтер = x»? Требуется ли настройка объекта «Принтер» на наличие каких-либо прав на конфигурацию для целевого принтера или что-то еще? –
Если пользователь может получить доступ к принтеру вне программы, я менее склонен думать, что это может быть проблема с доступом. –
Ошибка 5 - это почти наверняка ошибка времени выполнения VB 5 «Неверный вызов или аргумент процедуры». Вы не получили бы ошибку Win32 от выполнения инструкции 'Set'. Вы получаете только ошибки Win32 от VB6 при вызове API с помощью оператора 'Declare', а затем вы должны их обнаружить, просмотрев свойство' Err.LastDllError' – MarkJ
Вы используете такой код, чтобы исправить его? Не просто пытаться установить его по строке?
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
. Да, приложение устанавливает объект «Принтер» на объект «Принтер» из Коллекция принтеров. Он устанавливает Принтер на принтер квитанции, распечатывает квитанцию, затем устанавливает Принтер обратно на принтер по умолчанию Win. Если это копир, возникает ошибка. Если принтер по умолчанию не является копиром, ошибки не возникает. –
см. Мой пересмотренный ответ - с помощью Printer.TrackDefault = False, чтобы избежать изменения принтера по умолчанию и, следовательно, не нужно его устанавливать. –
Вы можете посмотреть на следующей странице:
http://support.microsoft.com/kb/322710
Всякий раз, когда печать в VB6 Я всегда использую это диалоговое окно вместо стандартного диалогового окна, который поставляется с VB6. Это намного надежнее.
Я решил эту проблему в MS Access 2007 VBA, включив имя сервера вместе с именем принтера.
Application.Printer = Application.Printers("\\servername\printername")
вместо
Application.Printer = Application.Printers("printername")
Надеется, что это помогает кто-то другое.
Я получал эту ошибку и после нескольких часов разочарования нашел свой ответ. Это вопрос, чувствительный к делу. У меня был Капитал «S», когда я должен был иметь нижний регистр.
Так когда код выглядит следующим образом:
XeroxReport = "\\Share\Red Xerox 430"
Set Application.Printer = Application.Printers(XeroxReport)
Я хотел бы получить ошибку 5
Но когда я изменил его:
XeroxReport = "\\share\Red Xerox 430"
Set Application.Printer = Application.Printers(XeroxReport)
вуаля он работал
Ты уверен, что ошибка указана в строке Set Printer?Я столкнулся с ошибками при настройке различных свойств, которые не применимы к конкретному принтеру. Но не на заданной линии. –
Да, это правильно на линии «Установить принтер». Источник имеет номер строки, а обработчик ошибок отображает значение Erl как часть сообщения об ошибке. –