• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

двусторонняя печать Doc файла из Lotus'a

  • Автор темы Dikobraz Grey
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

Dikobraz Grey

Всем доброго времени суток.
Столкнулся с проблемой при использовании OLE Word'a 2003.

Пытаюсь запустить из Lotus'a ручную двустороннюю печать файла Word'a:

[codebox]
Sub Click(Source As Button)
On Error Goto er1

Dim wordObject As Variant
Dim pvWordDocument As Variant
Dim Background As Variant
Dim Range As Variant
Dim Copies As Variant
Dim PageType As Variant
Dim PrintToFile As Variant
Dim Collate As Variant
Dim ManualDuplexPrint As Variant

Set wordObject=CreateObject("Word.Application")
If Isobject(wordObject) Then
wordObject.Visible=True
Set pvWordDocument=wordObject.Documents.Open("D:\test2.doc")
End If
Background=True
Range=Microsoft.Office.Interop.Word.WdPrintOutRange.wdPrintAllDocument
Copies=1
PageType=Microsoft.Office.Interop.Word.WdPrintOutPages.wdPrintAllPages
PrintToFile=False
Collate=False
ManualDuplexPrint=True
Call pvWordDocument.PrintOut(Background, Range, Copies,PageType, PrintToFile, Collate, ManualDuplexPrint)
Exit Sub

er1:

Msgbox Error$ & Chr(10) & Getthreadinfo(1) & " (l." & Erl & ")"
Resume WorkDone
WorkDone:
End Sub[/codebox]



В приведенном коде получаю ошибку при запуске "Variant does not contain an object" при инициализации Range.

При попытке передачи параметров Range и PageType просто числами:
[codebox]

Background=True
Copies=1
PrintToFile=False
Collate=False
ManualDuplexPrint=True
Call pvWordDocument.PrintOut(Background, 0, Copies,0, PrintToFile, Collate, ManualDuplexPrint) [/codebox]

код падает при вызове PrintOut с ошибкой "Automation object argument type mismatch". Причем похоже, падает на параметре PageType (второй ноль).

Если же инициализировать Range и PageType по имени константы:

[codebox] Background=True
Range=wdPrintAllDocument
Copies=1
PageType=wdPrintAllPages
PrintToFile=False
Collate=False
ManualDuplexPrint=True
Call pvWordDocument.PrintOut(Background, Range, Copies,PageType, PrintToFile, Collate, ManualDuplexPrint) [/codebox]

код валится опять же на PrintOut, c той же ошибкой "Automation object argument type mismatch"


Может кто подскажет, как правильно передать параметры в функцию PrintOut?
По идее все параметры этой функции по MSDN и прочим источникам имеют тип Object, но Lotus его не знает ;)
Ошибка "Variant does not contain an object" при попытке инициализации констант через Microsoft.Office.Interop.Word вполне логична и ожидаема, но я уже не знаю как правильно достучаться до них. Почему то кажется , что проблема именно в Range и PrintOut.

Заранее спасибо за помощь.
 
A

amigolinx

При попытке передачи параметров Range и PageType просто числами:
Была похожая трабла с вордовыми объектами. Точно сейчас уже не помню, кажись нада копать в сторону полной передачи параметров числами (я их наискивал в вордовском Object Browser'e - в редакторе VBA вызывается. там внизу в статус баре выдается инфа по численным соответствиям мемберов вордовых объектов):
Код:
Call pvWordDocument.PrintOut(1, 0, 1, 0, 0, 0, 1)
Ошибка "Variant does not contain an object" при попытке инициализации констант через Microsoft.Office.Interop.Word вполне логична и ожидаема, но я уже не знаю как правильно достучаться до них.
и я бы не юзал такую конструкцию, пробуй напрямую обращаться к ворду и его "детям":
Код:
Set word = CreateObject("Word.Application")
Call word.ActiveDocument.PrintOut(1, 0, 1, 0, 0, 0, 1)
да и кстати еще замутка в том, чтобы передавать ворду все параметры его ф-ии - там где у него Optional (по мойму для этих целей Nothing отлично катит) - а в этой ф-ии они все такие *брал из 2007-го - может чуток отличаться* : PrintOut(Background, Append, Range, OutputFileName, From, To, Item, Copies, Pages, PageType, PrintToFile, Collate, FileName, ActivePrinterMacGX, ManualDuplexPrint, PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth, PrintZoomPaperHeight). Те которые играют в твоем коде, пиши прям в числах, а которые не играют - подставь Nothing
 
T

turumbay

Если же инициализировать Range и PageType по имени константы:
код валится опять же на PrintOut, c той же ошибкой "Automation object argument type mismatch"
А если попробовать задекларировать
Const wdPrintAllDocument = 0
Const wdPrintAllDocument = 0

Значения констант подсмотрены тут:
 
A

amigolinx

"Урра! Заработало!" ©

Вордовая ф-ия требует четкой последовательности параметров, то есть поскольку она объявлена как
PrintOut(Background, Append, Range, OutputFileName, From, To, Item, Copies, Pages, PageType, PrintToFile, Collate,
FileName, ActivePrinterMacGX, ManualDuplexPrint, PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth, PrintZoomPaperHeight)
получается, что в первоначальном варианте в то время, как она хотела OutputFileName (строчечку то есть) мы ей отдавали Integer, вот она и матюгалась.
А ее нужно покормить соответственно, благо можно не все параметры передавать, а до определенного нужного нам места - мне хватило духу добраться до Collate, дальше устал запятые считать ;) но принцип, думаю, понятен

Код:
Sub Click(Source As Button)
On Error Goto er1

Dim wordObject As Variant
Dim pvWordDocument As Variant

Set wordObject=CreateObject("Word.Application")
If Isobject(wordObject) Then
wordObject.Visible=True
Set pvWordDocument=wordObject.Documents.Open("D:\test2.doc")
End If

Call pvWordDocument.printout(, , 0, , , , 0, 1, , 0, , 1)	

Exit Sub

er1:

Msgbox Error$ & Chr(10) & Getthreadinfo(1) & " (l." & Erl & ")"
Resume WorkDone
WorkDone:
End Sub
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!