![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мониторинг сетевых принтеров. [D6, Win2k, WinXP]
Максимм © (2007-07-30 11:14:00)Необходимо написать программу для мониторинга сетевых прнтеров. Для реализации использую следующую функцию:
EnumJobs(hPrinter, 0, Length(aJobs), 1, @aJobs, cbBuf, pcbNeeded, pcReturned); Проблемма возникла в том что она некоректно возвращает количество рачпечаннх страниц. Как это можно исправить?? Или может есть какой нибудь другой способ???
Anatoly Podgoretsky (2007-07-30 19:24:00) [1]При том для большинства!
Кроме того я могу задать количество копий на принтере, тогда вообще швах.
Rouse_ (2007-07-30 12:34:00) [2]
> но значение PagesPrinted всегда равно "0" ....
Исесно... я ж говрю - читай внимательней MSDN...
PagesPrinted
Specifies the number of pages that have printed. This value may be zero if the print job does not contain page delimiting information.
Сергей М. (2007-07-30 12:07:00) [3]
> Максимм (30.07.07 12:03) [9]
Что, и для Level = 2 тоже равно нулю ?!
Максимм (2007-07-30 12:03:00) [4]я вас удивлю наверное, но значение PagesPrinted всегда равно "0" ....
не задавл бы таких вопросов если бв не попробавл .....
Сергей М. (2007-07-30 11:57:00) [5]
> // то самое значение (aJobs[i].TotalPages)
Что значит "то самое" ?
Ты же задал вопрос о кол-ве распечатанныхстраниц, а не об полном кол-ве страниц !
И на то в структуре есть поле PagesPrinted, которое ни сном ни духом не фигурирует в твоем коде.
Rouse_ (2007-07-30 11:57:00) [6]Кол-во расчечатанных страниц вообще-то PagesPrinted...
Это раз, а во вторых нужно тщательней курить MSDN...
To determine the number of print jobs in the printer queue, call the GetPrinter function with the Level parameter set to 2
Максимм (2007-07-30 11:36:00) [7]type
JOB_INFO_1_ARRAY = Array of JOB_INFO_1;
Function GetSpoolerJobs(sPrinterName : String) : JOB_INFO_1_ARRAY;
var
i : Integer;
hPrinter : THandle;
bResult : Boolean;
cbBuf : DWORD;
pcbNeeded : DWORD;
pcReturned : DWORD;
aJobs : Array[0..99] of JOB_INFO_1;
begin
cbBuf := 256;
OpenPrinter(PChar(sPrinterName), hPrinter, Nil);
EnumJobs(hPrinter, 0, Length(aJobs), 1, @aJobs, cbBuf, pcbNeeded, pcReturned);
ClosePrinter(hPrinter);
For i := 0 to pcReturned - 1 do
Begin
SetLength(Result, Length(Result) + 1);
Result[Length(Result) - 1] := aJobs[i];
End;
End;
procedure TForm1.Timer1Timer(Sender: TObject);
Var
i, ii, K, p : Integer;
aJobs : JOB_INFO_1_ARRAY;
Begin
Try
aJobs := GetSpoolerJobs('ПРИНТЕР');
For i := 0 To Length(aJobs) - 1 Do
Begin
S := IntToStr(aJobs[i].JobId) + #9 +
TimeToStr(Time) + #9 +
aJobs[i].pPrinterName + #9 +
aJobs[i].pMachineName + #9 +
aJobs[i].pUserName + #9 +
aJobs[i].pDocument + #9 +
IntToStr(aJobs[i].TotalPages);
// то самое значение (aJobs[i].TotalPages)
// Массив заданий
If Z1[aJobs[i].JobId] = 0 then
Begin
// записывает данные в файл
Z1[aJobs[i].JobId] := 1;
End;
End;
Except End;
End;
Сергей М. (2007-07-30 11:29:00) [8]Ну тогда показывай свой код ...
Максимм (2007-07-30 11:26:00) [9]Что значит сколько должно быть ??? Количество страниц всегда разное ...
Сергей М. (2007-07-30 11:25:00) [10]
> Практически всегда возвращает 1 или 0
А сколько на самом деле д.б. ?
Максимм (2007-07-30 11:21:00) [11]Практически всегда возвращает 1 или 0. То же самое с количеством копий.
Сергей М. (2007-07-30 11:19:00) [12]
> она некоректно возвращает количество рачпечаннх страниц
И в чем заключается "некорректность" ?