Печать заданного документа на заданный принтер - VB

Узнай цену своей работы

Формулировка задачи:

Задача:
Есть ДОКУМЕНТ (xls, doc,txt,jpg,итд), суть что в виндах указано или не указано как его печатать
Есть ПРИНТЕР bla-bla-bla (он не обязательно по умолчанию).
Надо: напечатать ДОКУМЕНТ на принтер bla-bla-bla, при этом желательно получить результат, типа напечатался или нет.
Один из вариантов решения:
Читаем тут: http://www.biopdf.com/guide/examples/command_line/
Скачиваем утилиту printto.exe
http://www.biopdf.com/guide/examples/command_line/files.zip
Выполняем команду
Наблюдаем результат, в файле printrezult.txt либо ничего нет (все прошло успешно),
либо что-то есть, т.е. информация об ошибке, в общем если что-то пошло не так, то файл не пустой, напр.система не знает, как печатать файл "*.exe".
Далее думаем как применить VB, Shell работает, но с файлом printrezult.txt проблемы, то не образуется, то пустой при явной ошибке.
Ладно, ругаемся, идем читать старую забытую тему.
Чтение результатов работы консольного приложения
Находим код, предоставленный

Konst_One


Вместо Shell запускаем
Доделываем ее на свой лад,
и все хорошо, если len(ExecCmd)= 0, то OK,
если не нулю, то печать не удалась.
printto.exe работает на ура, требует правда net.framework 2.0, но это не беда ибо мое большое приложение тоже его требует.
Однако...
Есть ли способ эту ерунду сделать через какие-либо API, не прибегая к exe-шнику стороннего производителя, из анализа exe-шника я ничего не понял, использует mscoree.dll, анализ кот. идей не добавляет, и очевидно ссылки на Framework внутри,очень маленький. (обычно из просмотра exe черех hex понимается имя библиотеки и какие API искать).
Winspool.drv мне ничего не дал, на Miсrosoft есть пример, но это похоже лишь для печати текста.
ShellExecute(...print..) вроде работает, но во-первых мне показалось, что с глюками, а во-вторых он печатает только на принтер "по-умолчанию", что противоречит условиям задачи.

Решение задачи: «Печать заданного документа на заданный принтер»

textual
Листинг программы
<font color="blue">Private</font> <font color="blue">Sub</font> Command4_Click()
    <font color="blue">Dim</font> strPrinterName <font color="blue">As</font> <font color="blue">String</font>
    <font color="blue">Dim</font> strFile <font color="blue">As</font> <font color="blue">String</font>
    <font color="blue">Dim</font> res <font color="blue">as</font> <font color="blue">long</font>
    <font color="00AA00">'strPrinterName = <font color="teal">""</font><font color="teal">""</font> + <font color="teal">"Bla bla bla"</font> + <font color="teal">""</font><font color="teal">""</font></font>
    <font color="00AA00">'или (название принтера от греха подальше в кавычки)</font>
    strPrinterName = Chr(<font color="darkblue"><b>34</b></font>) & <font color="teal">"Bla bla bla"</font> & Chr(<font color="darkblue"><b>34</b></font>)
    strFile = ДОКУМЕНТ
    res = ShellExecute(<font color="darkblue"><b>0</b></font>, <font color="teal">"printto"</font>, strFile, strPrinterName, <font color="darkblue"><b>0</b></font>, SW_HIDE)
    <font color="00AA00">'Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise.</font>
    <font color="blue">If</font> res <= <font color="darkblue"><b>32</b></font> <font color="blue">Then</font>
        MsgBox <font color="teal">"Failed. Error code: "</font> & RaiseAPIError
    <font color="blue">Else</font>
        MsgBox <font color="teal">"ok"</font>
    <font color="blue">End</font> <font color="blue">If</font>
<font color="blue">End</font> <font color="blue">Sub</font>

  <font color="blue">Public</font> <font color="blue">Const</font> SW_HIDE = <font color="darkblue"><b>0</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOWNORMAL = <font color="darkblue"><b>1</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOWMINIMIZED = <font color="darkblue"><b>2</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOWMAXIMIZED = <font color="darkblue"><b>3</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOWNOACTIVATE = <font color="darkblue"><b>4</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOW = <font color="darkblue"><b>5</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_MINIMIZE = <font color="darkblue"><b>6</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOWMINNOACTIVE = <font color="darkblue"><b>7</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOWNA = <font color="darkblue"><b>8</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_RESTORE = <font color="darkblue"><b>9</b></font>
  <font color="blue">Public</font> <font color="blue">Const</font> SW_SHOWDEFAULT = <font color="darkblue"><b>10</b></font>
 
<font color="blue">Private</font> <font color="blue">Const</font> FORMAT_MESSAGE_FROM_SYSTEM = &H1000
<font color="blue">Private</font> <font color="blue">Const</font> FORMAT_MESSAGE_IGNORE_INSERTS = &H200

<font color="blue">Public</font> <font color="blue">Declare</font> <font color="blue">Function</font> ShellExecute Lib <font color="teal">"shell32.dll"</font> Alias <font color="teal">"ShellExecuteA"</font> (<font color="blue">ByVal</font> hwnd <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> _
 lpOperation <font color="blue">As</font> <font color="blue">String</font>, <font color="blue">ByVal</font> lpFile <font color="blue">As</font> <font color="blue">String</font>, <font color="blue">ByVal</font> lpParameters <font color="blue">As</font> <font color="blue">String</font>, <font color="blue">ByVal</font> lpDirectory <font color="blue">As</font> <font color="blue">String</font>, _
<font color="blue">ByVal</font> nShowCmd <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Public</font> <font color="blue">Declare</font> <font color="blue">Function</font> FormatMessage Lib <font color="teal">"kernel32"</font> Alias <font color="teal">"FormatMessageA"</font> (<font color="blue">ByVal</font> dwFlags <font color="blue">As</font> <font color="blue">Long</font>, _
lpSource <font color="blue">As</font> Any, <font color="blue">ByVal</font> dwMessageId <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> dwLanguageId <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> lpBuffer <font color="blue">As</font> <font color="blue">String</font>, _
<font color="blue">ByVal</font> nSize <font color="blue">As</font> <font color="blue">Long</font>, Arguments <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>

<font color="blue">Public</font> <font color="blue">Function</font> RaiseAPIError() <font color="blue">As</font> <font color="blue">String</font>
    <font color="blue">Dim</font> ErrorMsg <font color="blue">As</font> <font color="blue">String</font>, ErrNum <font color="blue">As</font> <font color="blue">Long</font>
    ErrNum = Err.LastDllError
    ErrorMsg = <font color="blue">String</font>(<font color="darkblue"><b>256</b></font>, <font color="darkblue"><b>0</b></font>)
    ErrorMsg = Left$(ErrorMsg, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM <font color="blue">Or</font> _
FORMAT_MESSAGE_IGNORE_INSERTS, <font color="darkblue"><b>0</b></font>, ErrNum, <font color="darkblue"><b>0</b></font>&, ErrorMsg, Len(ErrorMsg), <font color="blue">ByVal</font> <font color="darkblue"><b>0</b></font>))
    <font color="blue">If</font> <font color="blue">Mid</font>(ErrorMsg, Len(ErrorMsg) - <font color="darkblue"><b>1</b></font>) = vbCrLf <font color="blue">Then</font>
        ErrorMsg = <font color="blue">Mid</font>(ErrorMsg, <font color="darkblue"><b>1</b></font>, Len(ErrorMsg) - <font color="darkblue"><b>2</b></font>)
    <font color="blue">End</font> <font color="blue">If</font>
    RaiseAPIError = ErrNum & <font color="teal">" ("</font> & ErrorMsg & <font color="teal">")"</font>
<font color="blue">End</font> <font color="blue">Function</font>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.4 из 5
Похожие ответы