У меня есть следующий код автоматизации:
lPrintSetup := fWordObject.Application.Dialogs.Item(wdDialogFilePrintSetup);
lPrintSetup.Printer := 'MyPrinter';
lPrintSetup.DoNotSetAsSysDefault := True;
lPrintSetup.Execute;
lPrintSetup := Null;
Свойство Printer
вызывает у меня некоторые проблемы, иногда Execute
завершается с ошибкой EOleException (0x800A1460 (код ошибки 5216): ошибка принтера) из-за неправильного имени принтера.
У меня есть информация о принтерах всех принтеров в записи _PRINTER_INFO_2
, которую я получил с помощью вызова API EnumPrinters. Как мне составить правильное имя принтера для Word, учитывая информацию в записи _PRINTER_INFO_2
? Он работает как минимум с Windows 2000, Word 2000 и Citrix.
Некоторая справочная информация:
Наше приложение сначала заполнило Имя_принтера самостоятельно созданным именем_принтера. Это создавало проблемы с клиентами Citrix, поэтому для клиентов Citrix мы взяли _PRINTER_INFO_2.pPortName
и удалили часть Client: #:.
Это работает для большинства наших клиентов, но иногда все равно появляется ошибка принтера.
Что я уже пробовал (в Windows XP SP3, Word 2007):
- Просто возьмите
_PRINTER_INFO_2.pPrinterName
. Проблема в том, что когда вы целенаправленно изменяете имена принтеров (переименовывая «PDFCreator» в «HP DESKJET 520 на MYPC»), происходит сбой последнего (при выборе этого принтера в Word работает).
- Составление имени принтера следующим образом:
lPrintSetup.Printer := PRINTER_INFO_2.pPrinterName + ' on ' + PRINTER_INFO_2.pPortname
. Кажется, работает всегда! Но поиск в Google показал, что «on» локализован, поэтому я не уверен, сработает ли это для неанглийских версий Windows. Редактировать: не всегда работает: (
Еще одно решение, которое я нашел в Интернете:
При чтении имени принтера из Word он имеет вид «Имя принтера в Ne01:», где Ne01 находится в диапазоне от Ne00: до Ne99 :. В решении было предложено взять имя принтера и просто попытаться установить его во время цикла от Ne00: до Ne99 :. Когда .Execute не падает, у вас есть правильный. Мне не очень нравится этот метод «след и ошибка».