powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Печать заданного документа на заданный принтер
2 сообщений из 2, страница 1 из 1
Печать заданного документа на заданный принтер
    #35844431
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача:
Есть ДОКУМЕНТ (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
Выполняем команду
Код: plaintext
printto.exe "ДОКУМЕНТ" "bla-bla-bla" > printrezult.txt
Наблюдаем результат, в файле printrezult.txt либо ничего нет (все прошло успешно),
либо что-то есть, т.е. информация об ошибке, в общем если что-то пошло не так, то файл не пустой, напр.система не знает, как печатать файл "*.exe".
Далее думаем как применить VB, Shell работает, но с файлом printrezult.txt проблемы, то не образуется, то пустой при явной ошибке.
Ладно, ругаемся, идем читать старую забытую тему.
Чтение результатов работы консольного приложения
Находим код, предоставленный Konst_One
Вместо Shell запускаем
Код: plaintext
Function ExecCmd(ByVal cmdline As String)
Доделываем ее на свой лад,
и все хорошо, если 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..) вроде работает, но во-первых мне показалось, что с глюками, а во-вторых он печатает только на принтер "по-умолчанию", что противоречит условиям задачи.
...
Рейтинг: 0 / 0
Печать заданного документа на заданный принтер
    #35845093
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то это именно ShellExecute, подвох в 4-м параметре (имя принтера), также надо понимать, что все res>32 не ошибка, а OK, ну а SW_HIDE к сожалению не работает, плевала она на 6-й параметр:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Private Sub Command4_Click()
    Dim strPrinterName As String
    Dim strFile As String
    Dim res as long
    'strPrinterName = """" + "Bla bla bla" + """"
    'или (название принтера от греха подальше в кавычки)
    strPrinterName = Chr( 34 ) & "Bla bla bla" & Chr( 34 )
    strFile = ДОКУМЕНТ
    res = ShellExecute( 0 , "printto", strFile, strPrinterName,  0 , SW_HIDE)
    'Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise.
    If res <=  32  Then
        MsgBox "Failed. Error code: " & RaiseAPIError
    Else
        MsgBox "ok"
    End If
End Sub

  Public Const SW_HIDE =  0 
  Public Const SW_SHOWNORMAL =  1 
  Public Const SW_SHOWMINIMIZED =  2 
  Public Const SW_SHOWMAXIMIZED =  3 
  Public Const SW_SHOWNOACTIVATE =  4 
  Public Const SW_SHOW =  5 
  Public Const SW_MINIMIZE =  6 
  Public Const SW_SHOWMINNOACTIVE =  7 
  Public Const SW_SHOWNA =  8 
  Public Const SW_RESTORE =  9 
  Public Const SW_SHOWDEFAULT =  10 
 
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200

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

Public Function RaiseAPIError() As String
    Dim ErrorMsg As String, ErrNum As Long
    ErrNum = Err.LastDllError
    ErrorMsg = String( 256 ,  0 )
    ErrorMsg = Left$(ErrorMsg, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or _
FORMAT_MESSAGE_IGNORE_INSERTS,  0 , ErrNum,  0 &, ErrorMsg, Len(ErrorMsg), ByVal  0 ))
    If Mid(ErrorMsg, Len(ErrorMsg) -  1 ) = vbCrLf Then
        ErrorMsg = Mid(ErrorMsg,  1 , Len(ErrorMsg) -  2 )
    End If
    RaiseAPIError = ErrNum & " (" & ErrorMsg & ")"
End Function
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Печать заданного документа на заданный принтер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]