Марк Дурдин имеет отличный пост в блоге с подробным примером на Delphi. Он легко переносим на C ++ и другие языки:
Демистификация печати с помощью элемента управления Microsoft WebBrowser и ShowHTMLDialogEx
В частности, __IE_PrinterCmd_DevMode
должен быть разблокирован HGLOBAL
(как правило, допустимое возвращаемое значение из GlobalAlloc
или GlobalReAlloc
). Это нигде не задокументировано, я полагаю, что Марк обнаружил трудный путь методом проб и ошибок, и, наконец, обнаружил, что он работает со значениями в полях PRINTDLG.hDevMode
и PRINTDLG.hDevNames
, как это прямо предусмотрено вызовом PrintDlg
.
Мне удалось передать HGLOBAL
s как целые числа в скрипт шаблона и использовать их для инициализации __IE_PrinterCmd_DevMode
и __IE_PrinterCmd_DevNames
перед созданием TemplatePrinter
. Это удобно, если вы не хотите звонить ShowHTMLDialogEx
самостоятельно и у вас уже есть зацепка в вашем приложении. Я использую объект сценария external
в исходном окне. Для доступа к нему из шаблона я использую:
dialogArguments.__IE_BrowseDocument.parentWindow.external
PS: Передача HGLOBAL
как целого числа работает в 32-разрядном процессе, поскольку числа JScript на самом деле являются двойными числами, которые могут представлять последовательные целые числа вплоть до 53-разрядных. Но из-за этого ограничения передача HGLOBAL
как целого числа в 64-битном процессе не является надежной.
Возможно, вы можете сделать так, чтобы у вашего window.external
объекта был метод, который ожидает объект dialogArguments
шаблона печати, который устанавливает __IE_PrinterCmd_DevMode
и __IE_PrinterCmd_DevNames
с целым числом VARIANT
s (VT_I8
или VT_UI8
).
Я еще не проверял это.
Если вы просто хотите выбрать принтер, отличный от системного по умолчанию, вы также можете установить свойство __IE_PrinterCMD_Printer
. Вы можете сделать это в JScript, это повлияет на объекты поведения TemplatePrinter
, которые вы создадите после его установки. Однако, используя только это свойство, вы не можете управлять начальными настройками или знать, какой принтер окончательно выбрал пользователь.