Операция не поддерживается, и выбранный принтер недействителен во время печати.

Надеюсь, кто-нибудь сможет помочь. В моем приложении Delphi 7 небольшой процент пользователей сообщает об ошибках при печати, и я пытаюсь решить эту проблему с последним из них. Я немного ограничен, когда дело доходит до тестирования (поскольку пользователь физически удален, и мы работаем по электронной почте), но я получаю некоторую дополнительную информацию от EurekaLog.

Во всяком случае, первая ошибка, которую он получил, это "Операция не поддерживается на выбранном принтере", в этой строке кода:

Printer.Orientation := AOrientation;

Итак, я предположил, что его принтер не поддерживает ориентацию (я никогда не слышал об этом, но, думаю, это возможно) и попробовал без этой строки кода. Но теперь он получает "Выбранный принтер недействителен" в этой строке:

Result := Printer.PageWidth / GetDeviceCaps(Printer.Handle, LOGPIXELSX);

Насколько я знаю, принтер выбран правильно (это Canon Pixma iP1500, но у других пользователей другие модели, струйные или лазерные), и он уже пытался обновить драйвера. ОС тоже различается - от XP до Vista SP1).

Я предложил ему попробовать другой принтер, но что бы он ни ответил, я не знаю, куда смотреть дальше. Поиск в гугле не дал никаких полезных результатов (по крайней мере, для меня). У кого-нибудь есть идея?

Заранее спасибо!


person vrad    schedule 12.01.2009    source источник
comment
Вы когда-нибудь находили решение этой ошибки?   -  person Scott W    schedule 09.06.2009
comment
Этот конкретный пользователь переустановил драйверы принтера, и проблема исчезла.   -  person vrad    schedule 10.06.2009
comment
Все решения, которые я нашел для этого, были чистой удачей. Я сделал все, что рекомендовали в этой теме, и ничего не помогает. Я даже удалил драйверы принтера и установил новый, и все равно точно такой же. Я отключил UAC, запустил от имени администратора, переустановил драйвера принтера, но все равно не повезло.   -  person Jerry Dodge    schedule 05.09.2014
comment
ПРИМЕЧАНИЕ. Отправленный отчет контроля качества: qc.embarcadero.com/wc/qcmain.aspx? д=127390   -  person Jerry Dodge    schedule 05.09.2014
comment
Я убежден, что это сочетание проблем Windows и Vcl. Если я правильно понимаю, Vcl использует устаревшие вызовы Windows API для принтеров, что приводит к этим проблемам. Проблема заключается в самой Windows, но единственная причина, по которой Vcl страдает от этой проблемы, заключается в том, что он использует устаревшие вызовы Windows API. Если бы Vcl был обновлен для использования более новых методов, этой проблемы, по-видимому, не возникло бы. По крайней мере, это моя догадка.   -  person Jerry Dodge    schedule 06.09.2014
comment
Не могли бы вы проверить, правильно ли установлен принтер, выбранный по умолчанию. Как заявил Джерри, Delphi использует неправильный вызов API для определения принтера по умолчанию. Выбор rpinter по умолчанию из списка принтеров в устройстве, которое только что использовалось после использования устройства Priners, может исправить это до использования принтера по умолчанию.   -  person Ritsaert Hornstra    schedule 06.09.2014
comment
@RitsaertHornstra Я не думаю, что OP готов ответить, я установил награду, потому что у меня тоже есть эта проблема, и я не хочу создавать повторяющийся вопрос. Я пробовал много вещей, меняя принтеры, все они создают одну и ту же проблему. Решила перезагрузка компьютера. Но к сожалению сейчас не могу воспроизвести. Однако я создал копию модуля «Принтеры» и изменяю его.   -  person Jerry Dodge    schedule 06.09.2014
comment
В это время любое приложение, созданное в Delphi, не может печатать.   -  person Jerry Dodge    schedule 08.09.2014


Ответы (10)


Не прямое решение, но может помочь решить проблему. Первое, что я делаю с такой проблемой, это получаю точную версию драйвера от клиента, а затем загружаю драйвер и устанавливаю его на свой компьютер с помощью LPT1. Затем я могу распечатать его для тестирования и решить любые проблемы с драйвером. Очевидно, я не могу печатать, но обычно это не проблема. Использование виртуальной машины также очень помогает.

person mj2008    schedule 12.01.2009
comment
Это происходит независимо от того, какой принтер/драйвер мы используем. - person Jerry Dodge; 05.09.2014

Не решение, а совет по уменьшению поверхности ошибки: установите (или попросите пользователя установить) виртуальный принтер в этой системе и попробуйте печатать на нем. К бесплатному (и как в пиве, и как в свободе) виртуальному принтеру PDF прилагается отличный PDFCreator . Он определенно поддерживает ориентацию страницы. Это даст вам известную хорошую основу для тестирования.

person Mihai Limbășan    schedule 12.01.2009
comment
Да, я предложил PDFCreator, но я все еще жду ответа (разница в часовых поясах). Тем не менее, я понятия не имею, что делать дальше, независимо от результатов. Я надеялся, что у кого-то была подобная проблема раньше. Я отмечу все ответы как полезные (потому что так и есть), но пока оставлю вопрос открытым. - person vrad; 12.01.2009
comment
Нет необходимости устанавливать дополнительные принтеры. XP и выше уже имеют принтер XPS от Microsoft. - person Torbins; 08.09.2011

Вы говорите, что небольшой процент пользователей сообщает о проблемах. Вы хоть представляете, в чем разница между этими и другими пользователями?

В раздумьях о:

  • подержанные принтеры
  • драйверы принтера (версия)
  • Используемая ОС, включая исправления и обновления (не забывайте об обновлениях IE)
  • версия вашего ПО
  • другое установленное ПО

Есть ли у пользователей проблемы с печатью в других приложениях?

Было бы здорово, если бы вы смогли воспроизвести проблему.

person Toon Krijthe    schedule 12.01.2009
comment
Спасибо за ваш ответ. Хотя я получаю системную информацию от тех, кто сообщает о проблеме, я понятия не имею, работает ли она для других с аналогичными системами (их тысячи, и не все отправляют отчет об ошибке, если это происходит). - person vrad; 12.01.2009
comment
Для меня это начало происходить в одночасье. Никогда не было этой проблемы, а сегодня пришел, и на моем компьютере она постоянно. Имеет отношение только к Vcl.Printers.TPrinter.Orientation независимо от того, какой принтер я использую. Никаких программно-аппаратных изменений. - person Jerry Dodge; 05.09.2014

У меня есть клиент с похожей (или, по крайней мере, похожей) проблемой. Строка кода, в которой мы получаем сообщение «Выбранный принтер недействителен», немного отличается (в библиотеке быстрых отчетов), но это точно так же вызов GetDeviceCaps.

Хотя нам еще предстоит найти реальное решение, мы нашли обходной путь. Если пользователь открывает диалоговое окно «Настройка принтера» перед попыткой распечатать отчет, ошибка не появляется.

Вы видели эти сайты, которые я нашел с некоторой помощью Google:

http://www.delphipages.com/threads/thread.cfm?ID=19871&G=19828

http://www.contactplus.com/cfaq/index.php?qid=381&catid=4

person Scott W    schedule 13.01.2009

У меня были пользователи, сообщающие об этой же ошибке, но только в Windows Vista. Windows XP и 7, похоже, не имеют такой же проблемы. Я обнаружил, что на компьютерах с Windows Vista отключение UAC устраняет эту проблему.

person Robert    schedule 08.09.2011
comment
Хотя у меня есть именно эта проблема, я использую Windows 7 с полностью отключенным UAC. - person Jerry Dodge; 05.09.2014

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

procedure InvalidatePrinter;
var
  dev,
  driv,
  port: array[0..80] of Char;
  deviceMode: THandle;
begin
  Printer.GetPrinter(dev, driv, port, deviceMode);
  Printer.SetPrinter(dev, driv, port, 0)
end;
person Trinidad    schedule 23.11.2011
comment
Это было в Delphi 7. Я использовал его для сброса информации о принтере, заставив RTL снова получить ее из Windows. IIRC Я сделал это, потому что обнаружил, что информация, хранящаяся в Delphi, была повреждена по какой-то неизвестной мне причине. Возможно, код RTL работает по-другому в вашей версии Delphi, но на вашем месте я бы включил отладку dcus и выполнил отладку в RTL, чтобы увидеть, что там происходит. - person Trinidad; 07.09.2014

Ошибка, которую вы получаете, указывает на то, что SetDefaultPrinter или перечисление принтеров не работают. SetDefaultPrinter выглядит немного пугающе в Delphi 7. Например, он пытается прочитать принтер по умолчанию из реестра. В новых версиях Delphi стало лучше, но я все еще исправляю Printers.pas в каждой новой версии.

Это мой патч для Delphi 2009. Возможно, вам придется внести некоторые коррективы в Delphi 7, но это должно дать вам представление. От первоначальной функции мало что осталось.

{$IFDEF UNICODE}
function GetDefaultPrinter(DefaultPrinter: PChar; var I: Integer): BOOL; stdcall;
  external winspl name 'GetDefaultPrinterW';
{$ELSE}
function GetDefaultPrinter(DefaultPrinter: PChar; var I: Integer): BOOL; stdcall;
  external winspl name 'GetDefaultPrinterA';
{$ENDIF}

procedure TPrinter.SetToDefaultPrinter; //@@@ SZ
var
  I: Integer;
  Err: DWORD;
  Device: PChar;
begin
  I := 0;
  if not GetDefaultPrinter(nil, I) then       //  (this should return false because the buffer is too small)
  begin
    Err := GetLastError;
    if (Err = ERROR_FILE_NOT_FOUND) or (I = 0) then
       RaiseError(SNoDefaultPrinter)
    else if Err = ERROR_INSUFFICIENT_BUFFER then
    begin
      Device := StrAlloc(I);
      try
        if GetDefaultPrinter(Device, I) then
        with Printers do
          for I := 0 to Count-1 do
          begin
            if AnsiSameText(TPrinterDevice(Objects[I]).Device, Device) then
            begin
              with TPrinterDevice(Objects[I]) do
                SetPrinter(PChar(Device), PChar(Driver), PChar(Port), 0);
              Exit;
            end;
          end
        else
          RaiseLastOSError;
      finally
        StrDispose(Device);
      end;
    end
    else
      RaiseLastOSError;
  end;
  RaiseError(SNoDefaultPrinter);
end;

Если это не сработает, то следующим шагом будет проверка причины сбоя перечисления принтеров. Взгляните на «Устройство», «Драйвер», «Порт» в списке TPrinterDevice.

person Sebastian Z    schedule 10.09.2014

http://zpay.com/vbulletin/showthread.php?2310-Printer-selected-is-not-valid , http://support.quickbooks.intuit.com/support/articles/SLN40193 и Delphi Win32 Service Printer Selected is not valid error on the 2008 64bit Standard server перечислите возможные причины.

Короче говоря, все они связаны с проблемами конфигурации, т. е. ваша программа не может получить доступ к принтеру по какой-либо причине.

Я предполагаю, что Delphi пытается открыть принтер по запросу, когда вы обращаетесь к соответствующему свойству, и, поскольку фреймворки печально известны этим, скрывает реальную ошибку.

Я бы посоветовал вам попытаться открыть принтер как можно явнее (например, с помощью OpenPrinter, затем попробуйте что-то вроде GetPrinterDataEx), поэтому вы получите некоторое сообщение об ошибке, которое даст как можно более конкретную подсказку о том, что именно пошло не так.

person ivan_pozdeev    schedule 12.09.2014

Это чисто анекдотично, но может иметь значение.

Я только что искал сообщение об ошибке «Выбранный принтер недействителен» в приложении Delphi 5.

Программное обеспечение создавало виртуальный принтер для создания файлов .pdf. Я обнаружил, что «старый» принтер был сохранен по его индексу, что было ненадежным средством возврата к нему после завершения операции pdf.

Изменив логику так, чтобы старый принтер был восстановлен по имени, я считаю, что смог решить свою проблему. (мы приступим к тестированию через несколько дней)


Кстати - QuickReports был задействован.

person Hugh Jones    schedule 12.09.2014

Возможно, вам придется настроить принтер delphi.pas - есть несколько ошибок в реализации принтера, по крайней мере, в более старых версиях delphi, например. если UNC-имя сетевого принтера слишком длинное, Delphi может выйти из строя.

person Tom    schedule 13.01.2009
comment
Спасибо. Есть ли список этих ошибок? Может уже обновленная версия? Быстрый поиск в гугле не дает особых результатов. - person vrad; 13.01.2009
comment
Я не могу найти эту проблему нигде в QC. - person Jerry Dodge; 05.09.2014