magazin-tyt.ru - Статус принтера отключен, незнаю как включить, сам принтер


Как проверить статус принтера

Meret
Member
Откуда:
Сообщений: 28
Господа,
Каким образом можно определить статус принтера,
интересуют следующие параметры
- Ready или Offline
- наличие бумаги в принтере

принтер может быть локальным (LPT/COM/USB) либо сетевым

Meret
Member
Откуда:
Сообщений: 28
и еще один вопрос:
- возможно ли каким-нибудь образом получить подтверждение от принтера об успешном завершении печати. Meret
Member
Откуда:
Сообщений: 28
нашел в инете следующий код function TestPrinterStatus(LPTPort: Word): Byte; var Status: byte; CheckLPT: word; begin Status := 0; if (LPTPort >= 1) and (LPTPort <= 3) then begin CheckLPT := LPTPort - 1; asm mov dx, CheckLPT; mov al, 0; mov ah, 2; int 17h; mov &Status, ah; end; end; Result := Status; end;
но это совсем не то, здесь опрашивается только LPT порт
а мне нужны COM, USB и сетевые пути к принтерам
:-( Dimitry Sibiryakov
Member
Откуда:
Сообщений: 43610
Meret Каким образом можно определить статус принтера,
Windows.GetPrinter level 2.

Posted via ActualForum NNTP Server 1.4

Meret
Member
Откуда:
Сообщений: 28
Dimitry Sibiryakov
Meret Каким образом можно определить статус принтера,
Windows.GetPrinter level 2.
можно показать на примере? __Avenger__
Member
Откуда:
Сообщений: 1956
Meret Dimitry Sibiryakov
Meret Каким образом можно определить статус принтера,
Windows.GetPrinter level 2.
можно показать на примере? APrinterHandle := 0; try Printer.PrinterIndex := APrinterIndex; APrinterHandle := GetPrinterHandle; ABytesNeeded := 0; if not WinSpool.GetPrinter(APrinterHandle, 2, nil, 0, @ABytesNeeded) then if Windows.GetLastError <> ERROR_INSUFFICIENT_BUFFER then begin AOSLastError := Windows.GetLastError; LogMessage('%s(%s) OS Error: Code=%d, Message:'#13#10'%s', [ClassName, 'CreateMonitor\GetPrinter', AOSLastError, SysErrorMessage(AOSLastError)]); RaiseLastOSError(AOSLastError); end; GetMem(APrinterInfo, ABytesNeeded); try if not WinSpool.GetPrinter(APrinterHandle, 2, APrinterInfo, ABytesNeeded, @ABytesNeeded) then begin AOSLastError := Windows.GetLastError; LogMessage('%s(%s) OS Error: Code=%d, Message:'#13#10'%s', [ClassName, 'CreateMonitor\GetPrinter\Info', AOSLastError, SysErrorMessage(AOSLastError)]); RaiseLastOSError(AOSLastError); end; Result := TPrinterMonitor.InternalCreate; try Result.FLogger := ALogger; Result.LogMessage('Create TThread(%s), Handle=%s, ThreadID=%s', [Result.ClassName, IntToHex(Result.Handle, 8), IntToHex(Result.ThreadID, 8)]); Result.FPrinterHandle := APrinterHandle; Result.FOnJobChange := AOnJobChange; Result.FJobInformation := TPrinterJobInformation.Create( APrinterIndex, APrinterInfo^.pPrinterName, APrinterInfo^.pPortName, APrinterInfo^.pServerName, APrinterInfo^.pShareName ); Result.LogMessage('TThread(%s): Printer=%s, Server=%s, Port=%s', [IntToHex(Result.ThreadID, 8), Result.FJobInformation.PrinterName, Result.FJobInformation.PrinterServer, Result.FJobInformation.PrinterPort]); OutputDebugString(PChar('Create JobHandle =' + IntToHex(DWORD(Result.FJobInformation), 8))); except Result.FPrinterHandle := 0; // prevents ClosePrinter to be called twice Result.FOnJobChange := nil; FreeAndNil(Result); raise; end; finally FreeMem(APrinterInfo); end; except on E: Exception do begin if APrinterHandle <> 0 then ClosePrinter(APrinterHandle); LogMessage('%s(CreateMonitor): SID=%s, ExceptionClass=%s, Message:'#13#10'%s', [ClassName, '{7E53681D-8587-4EE9-A9EB-CF134B8BCEE6}', E.ClassName, E.Message]); end; end; __Avenger__
Member
Откуда:
Сообщений: 1956
var APrinterHandle: THandle; APrinterInfo: PPrinterInfo2; ABytesNeeded: DWORD; AOSLastError: DWORD; Meret
Member
Откуда:
Сообщений: 28
__Avenger__,

Какие модули при этом необходимо использовать?

Meret
Member
Откуда:
Сообщений: 28
Meret __Avenger__,

Какие модули при этом необходимо использовать?

сейчас вроде разобрался включил модули "Printers, WinSpool"

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Printers, WinSpool;
выдает следующие ошибки
[Error] Unit1.pas(35): Undeclared identifier: 'APrinterIndex'
[Error] Unit1.pas(36): Undeclared identifier: 'GetPrinterHandle'
[Error] Unit1.pas(42): Undeclared identifier: 'LogMessage'

как разрешить эти ошибки?

Anatoly Podgoretsky
Member
Откуда:
Сообщений: 62928
Разрешить просто - в uses указать имя модуля, в котором описаны эти идентификаторы

--
http://www.podgoretsky.com

Meret
Member
Откуда:
Сообщений: 28
Anatoly Podgoretsky Разрешить просто - в uses указать имя модуля, в котором описаны эти идентификаторы

--
http://www.podgoretsky.com

А где их найти? т.е. в каких модулях их можно найти?

Meret
Member
Откуда:
Сообщений: 28
я вставил следующий текст в новый проект Delphi 7 procedure TForm1.Button1Click(Sender: TObject); var APrinterHandle: THandle; APrinterInfo: PPrinterInfo2; ABytesNeeded: DWORD; AOSLastError: DWORD; begin APrinterHandle := 0; try Printer.PrinterIndex := APrinterIndex; APrinterHandle := GetPrinterHandle; ABytesNeeded := 0; if not WinSpool.GetPrinter(APrinterHandle, 2, nil, 0, @ABytesNeeded) then if Windows.GetLastError <> ERROR_INSUFFICIENT_BUFFER then begin AOSLastError := Windows.GetLastError; LogMessage('%s(%s) OS Error: Code=%d, Message:'#13#10'%s', [ClassName, 'CreateMonitor\GetPrinter', AOSLastError, SysErrorMessage(AOSLastError)]); RaiseLastOSError(AOSLastError); end; GetMem(APrinterInfo, ABytesNeeded); try if not WinSpool.GetPrinter(APrinterHandle, 2, APrinterInfo, ABytesNeeded, @ABytesNeeded) then begin AOSLastError := Windows.GetLastError; LogMessage('%s(%s) OS Error: Code=%d, Message:'#13#10'%s', [ClassName, 'CreateMonitor\GetPrinter\Info', AOSLastError, SysErrorMessage(AOSLastError)]); RaiseLastOSError(AOSLastError); end; Result := TPrinterMonitor.InternalCreate; try Result.FLogger := ALogger; Result.LogMessage('Create TThread(%s), Handle=%s, ThreadID=%s', [Result.ClassName, IntToHex(Result.Handle, 8), IntToHex(Result.ThreadID, 8)]); Result.FPrinterHandle := APrinterHandle; Result.FOnJobChange := AOnJobChange; Result.FJobInformation := TPrinterJobInformation.Create( APrinterIndex, APrinterInfo^.pPrinterName, APrinterInfo^.pPortName, APrinterInfo^.pServerName, APrinterInfo^.pShareName ); Result.LogMessage('TThread(%s): Printer=%s, Server=%s, Port=%s', [IntToHex(Result.ThreadID, 8), Result.FJobInformation.PrinterName, Result.FJobInformation.PrinterServer, Result.FJobInformation.PrinterPort]); OutputDebugString(PChar('Create JobHandle =' + IntToHex(DWORD(Result.FJobInformation), 8))); except Result.FPrinterHandle := 0; // prevents ClosePrinter to be called twice Result.FOnJobChange := nil; FreeAndNil(Result); raise; end; finally FreeMem(APrinterInfo); end; except on E: Exception do begin if APrinterHandle <> 0 then ClosePrinter(APrinterHandle); LogMessage('%s(CreateMonitor): SID=%s, ExceptionClass=%s, Message:'#13#10'%s', [ClassName, '{7E53681D-8587-4EE9-A9EB-CF134B8BCEE6}', E.ClassName, E.Message]); end; end; end;
при нажатии на кнопку Button1 ожидал увидеть сообщения об активных принтерах
что я делаю не так? Dimitry Sibiryakov
Member
Откуда:
Сообщений: 43610
Meret что я делаю не так?
Забыл включить мозг. Поиск по %DELPHI%\Sources тебе (может быть) поможет.

Posted via ActualForum NNTP Server 1.4

Meret
Member
Откуда:
Сообщений: 28
Dimitry Sibiryakov
Meret что я делаю не так?
Забыл включить мозг. Поиск по %DELPHI%\Sources тебе (может быть) поможет.

Мозг включил...
по этому адресу у нет модуле как проверить статус принтера которые содержат идентификатор "APrinterIndex"

Может все-таки кто-нибудь мне укажет в чем проблема?

Anatoly Podgoretsky
Member
Откуда:
Сообщений: 62928
Проблемв в том, в uses не указан модуль, в котором описаны эти идентификаторы

--
http://www.podgoretsky.com

Meret
Member
Откуда:
Сообщений: 28
Meret __Avenger__,

Какие модули при этом необходимо использовать?

так я же и спрашиваю какой модуль при этом использовать?

Meret
Member
Откуда:
Сообщений: 28
Anatoly Podgoretsky И в очердной раз - к первоисточнику.

--
http://www.podgoretsky.com

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

__Avenger__
Member
Откуда:
Сообщений: 1956
Meret Anatoly Podgoretsky И в очердной раз - к первоисточнику.

--
http://www.podgoretsky.com

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

Не, ну я валяюсь, неужели не додумать?

class function TPrinterMonitor.CreateMonitor(const APrinterIndex: Integer; const AOnJobChange: TPrinterJobEvent; ALogger: TLogger): TPrinterMonitor; var APrinterHandle: THandle; APrinterInfo: PPrinterInfo2; ABytesNeeded: DWORD; AOSLastError: DWORD; procedure LogMessage(const AMsg: String; const Args: array of const); begin if Assigned(ALogger) then ALogger.WriteMessage(Format(AMsg, Args)); end; // >>> ------------------------------------------------------------------------------------- function GetPrinterHandle: THandle; const PrinterDefaults: TPrinterDefaults = ( pDatatype: nil; pDevMode: nil; DesiredAccess: PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER ); var ADevice, ADriver, APort: array[0..MAX_PATH] of Char; hDeviceMode: THandle; begin Printer.GetPrinter(ADevice, ADriver, APort, hDeviceMode); if not OpenPrinter(@ADevice, Result, @PrinterDefaults) then begin AOSLastError := Windows.GetLastError; LogMessage('%s(%s) OS Error: Code=%d, Message:'#13#10'%s', [ClassName, 'CreateMonitor\GetPrinterHandle', AOSLastError, SysErrorMessage(AOSLastError)]); RaiseLastOSError(AOSLastError); end; end; // <<< ------------------------------------------------------------------------------------- begin Result := nil; if (APrinterIndex < 0) or (APrinterIndex >= Printer.Printers.Count) then raise EPrinterMonitorException.CreateFmt( '%s.CreateMonitor: Index "%d" is out of range. Valid indices are %d..%d.', [Self.ClassName, APrinterIndex, 0, Printer.Printers.Count - 1] ); APrinterHandle := 0; try Printer.PrinterIndex := APrinterIndex; APrinterHandle := GetPrinterHandle; ABytesNeeded := 0; if not WinSpool.GetPrinter(APrinterHandle, 2, nil, 0, @ABytesNeeded) then if Windows.GetLastError <> ERROR_INSUFFICIENT_BUFFER then begin AOSLastError := Windows.GetLastError; LogMessage('%s(%s) OS Error: Code=%d, Message:'#13#10'%s', [ClassName, 'CreateMonitor\GetPrinter', AOSLastError, SysErrorMessage(AOSLastError)]); RaiseLastOSError(AOSLastError); end; GetMem(APrinterInfo, ABytesNeeded); try if not WinSpool.GetPrinter(APrinterHandle, 2, APrinterInfo, ABytesNeeded, @ABytesNeeded) then begin AOSLastError := Windows.GetLastError; LogMessage('%s(%s) OS Error: Code=%d, Message:'#13#10'%s', [ClassName, 'CreateMonitor\GetPrinter\Info', AOSLastError, SysErrorMessage(AOSLastError)]); RaiseLastOSError(AOSLastError); end; Result := TPrinterMonitor.InternalCreate; try Result.FLogger := ALogger; Result.LogMessage('Create TThread(%s), Handle=%s, ThreadID=%s', [Result.ClassName, IntToHex(Result.Handle, 8), IntToHex(Result.ThreadID, 8)]); Result.FPrinterHandle := APrinterHandle; Result.FOnJobChange := AOnJobChange; Result.FJobInformation := TPrinterJobInformation.Create( APrinterIndex, APrinterInfo^.pPrinterName, APrinterInfo^.pPortName, APrinterInfo^.pServerName, APrinterInfo^.pShareName ); Result.LogMessage('TThread(%s): Printer=%s, Server=%s, Port=%s', [IntToHex(Result.ThreadID, 8), Result.FJobInformation.PrinterName, Result.FJobInformation.PrinterServer, Result.FJobInformation.PrinterPort]); OutputDebugString(PChar('Create JobHandle =' + IntToHex(DWORD(Result.FJobInformation), 8))); except Result.FPrinterHandle := 0; // prevents ClosePrinter to be called twice Result.FOnJobChange := nil; FreeAndNil(Result); raise; end; finally FreeMem(APrinterInfo); end; except on E: Exception do begin if APrinterHandle <> 0 then ClosePrinter(APrinterHandle); LogMessage('%s(CreateMonitor): SID=%s, ExceptionClass=%s, Message:'#13#10'%s', [ClassName, '{7E53681D-8587-4EE9-A9EB-CF134B8BCEE6}', E.ClassName, E.Message]); end; end; end;
Выложил функцию целеком. Лишнее надо удалить, нужное оставить.

Вызывается так:

var ANotifier: TPrinterMonitor; i, AOldPrinterIndex: Integer; begin if Printer.Printers.Count > 0 then begin AOldPrinterIndex := Printer.PrinterIndex; try for i := 0 to Printer.Printers.Count - 1 do begin ANotifier := TPrinterMonitor.CreateMonitor( i, DoJobNotification, FLogger ); if Assigned( ANotifier ) then FNotifiers.Add( ANotifier ); end; finally Printer.PrinterIndex := AOldPrinterIndex; end; end;
Но на части компьютеров вываливается сообщение при инициализации: 21.08.2009 08:48:09: TPrinterMonitorJobs(ServiceStart): SID={77D1E9C1-3FC6-4503-819D-E55374CB6069}, ExceptionClass=EPrinter, Message: : There is no default printer currently selected Исправить, пока не думал как. Времени нет.... __Avenger__
Member
Откуда:
Сообщений: 1956
Ошибка происходит тут: if Printer.Printers.Count > 0 then begin AOldPrinterIndex := Printer.PrinterIndex; try for i := 0 to Printer.Printers.Count - 1 do begin ANotifier := TPrinterMonitor.CreateMonitor( i, DoJobNotification, FLogger ); if Assigned( ANotifier ) then FNotifiers.Add( ANotifier ); end; finally Printer.PrinterIndex := AOldPrinterIndex; end; end; __Avenger__
Member
Откуда:
Сообщений: 1956
__Avenger__
Но на части компьютеров вываливается сообщение при инициализации: 21.08.2009 08:48:09: TPrinterMonitorJobs(ServiceStart): SID={77D1E9C1-3FC6-4503-819D-E55374CB6069}, ExceptionClass=EPrinter, Message: : There is no default printer currently selected Исправить, пока не думал как. Времени нет....

Думаю надо сделать просто так:

finally if AOldPrinterIndex > -1 then Printer.PrinterIndex := AOldPrinterIndex; end;
О как бывает, заодно и баг исправил...... Meret
Member
Откуда:
Сообщений: 28
Каким образом вызывать функцию вроде понятно
__Avenger__ Выложил функцию целеком. Лишнее надо удалить, нужное оставить.
не могу понять каким образом нужно расшарить функцию?
Источник: http://www.sql.ru/forum/689318/kak-opredelit-status-printera


Закрыть ... [X]

Как проверить уровень чернил в картридже принтера Учитель мастер цитаты

Как проверить статус принтера Подключение и настройка сетевого принтера в Windows 7
Как проверить статус принтера Статус принтера Автономная работа l Принтеры
Как проверить статус принтера Ответы статус принтера отключен, незнаю как
Как проверить статус принтера Как определить статус принтера / Delphi /
Как проверить статус принтера Проверка уровня чернил в принтере
Как проверить статус принтера Как включить принтер? - elHow
Более 25 лучших и самых популярных идей на тему «Цитаты о Городская реформа 1870 года кратко Дешевле сделать самому: красиво подписываем открытку Как вылечить флюс Кожные высыпания на теле взрослого: какие бывают виды сыпи, описание и фото Краска для ткани в баллончиках БАТИК и Я Модные платья на выпускной вечер 2016 Платья для Платья с кружевом: повседневные и праздничные платья с Поздравления с юбилеем 55 лет женщине и мужчине, маме