powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / кол-во заданий в очереди принтера
5 сообщений из 5, страница 1 из 1
кол-во заданий в очереди принтера
    #32256812
nataSid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Печатаю очень много, очередь переполняется в сетевом принтере, зависает.
приходится перезапускать заново.
Устанавливать таймер после, например, 20 отчетов на минуту не ризонно
потому что я не знаю загруженность сети (особенно во время всеобщей выдачи отчетов).

Как узнать из фокса (или присоединить к нему что-то) количество заданий в очереди сетевого принтера?
...
Рейтинг: 0 / 0
кол-во заданий в очереди принтера
    #32257002
Фотография YuriWhite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо нужно копать и юзать winspool.dll.
...
Рейтинг: 0 / 0
кол-во заданий в очереди принтера
    #32257413
po2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
po2
Гость
Используется API-функция GetPrinter с соответствующими параметрами. Подробный пример по ссылке
...
Рейтинг: 0 / 0
кол-во заданий в очереди принтера
    #32257563
GLB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GLB
Гость
LOCAL hPrn,needed,numitems,PrintInfo
hPrn = 0
needed=0
numitems=0
*ON ERROR ?"error",ERROR(),MESSAGE(),MESSAGE(1)
ON ERROR
#DEFINE JOB_STATUS_READY 0x0000
#DEFINE JOB_STATUS_PAUSED 0x0001
#DEFINE JOB_STATUS_ERROR 0x0002
#DEFINE JOB_STATUS_DELETING 0x0004
#DEFINE JOB_STATUS_SPOOLING 0x0008
#DEFINE JOB_STATUS_PRINTING 0x0010
#DEFINE JOB_STATUS_OFFLINE 0x0020
#DEFINE JOB_STATUS_PAPEROUT 0x0040
#DEFINE JOB_STATUS_PRINTED 0x0080
#DEFINE JOB_STATUS_DELETED 0x0100
#DEFINE JOB_STATUS_BLOCKED_DEVQ 0x0200
#DEFINE JOB_STATUS_USER_INTERVENTION 0x0400
#DEFINE DEF_PRIORITY 1
#DEFINE MIN_PRIORITY 1
#DEFINE MAX_PRIORITY 99
#DEFINE OFF_SET 64

DECLARE OpenPrinter IN winspool.drv ;
STRING PrintName,;
LONG @ hPrinter,;
STRING PrintDefault

DECLARE INTEGER CloseHandle IN kernel32;
INTEGER hObject

DECLARE RtlMoveMemory IN kernel32 AS CopyMemory;
STRING @ Destination,;
INTEGER SOURCE,;
INTEGER nLength


DECLARE INTEGER GetProcessHeap IN kernel32

DECLARE INTEGER HeapFree IN kernel32;
INTEGER hHeap,;
INTEGER dwFlags,;
INTEGER lpMem

DECLARE INTEGER HeapAlloc IN kernel32;
INTEGER hHeap,;
INTEGER dwFlags,;
INTEGER dwBytes

DECLARE INTEGER lstrlen IN kernel32.DLL;
STRING lpString

DECLARE INTEGER EnumPrinters IN winspool.drv;
INTEGER Flags,;
INTEGER NAME,;
INTEGER LEVEL,;
STRING @ pPrinterEnum,;
INTEGER cbBuf,;
INTEGER @ pcbNeeded,;
INTEGER @ pcReturned


DECLARE INTEGER EnumJobs IN winspool.drv;
INTEGER hPrinter,;
INTEGER FirstJob,;
INTEGER NoJobs,;
INTEGER Lvl,;
INTEGER pJob,;
INTEGER cbBuf,;
INTEGER @ pcbNeeded,;
INTEGER @ pcReturned

DECLARE INTEGER GetLastError IN kernel32

lcPrnName = GETPRINTER()
retval=OpenPrinter(lcPrnName , @hPrn, NULL)
IF !retval
IF retval=0
?"Can not open printer", GetLastError()
RETURN
ENDIF
ENDIF
needed=0
numitems = 0
retval = EnumJobs (hPrn, 0, 100, 1, PrintInfo, 0, @needed, @numitems)

IF needed=0
? "Queue is empty"
RETURN
ENDIF
SET TEXTMERGE TO c:\printqueue.txt
SET TEXTMERGE ON NOSHOW

TempBuff=HeapAlloc(GetProcessHeap(),0,needed)
lnNeeded=needed
retval=EnumJobs(hPrn,0,127,1,TempBuff,needed,@needed,@numitems)
\print jobs <<numitems>>
\-------------------------------------------
lpResult = REPLI (CHR(0), lnNeeded)
retval= CopyMemory (@lpResult, TempBuff, lnNeeded)

FOR i=0 TO numitems-1
\Job id <<buf2dword (SUBSTR(lpResult,i*OFF_SET+ 1,4))>>
\Printer name <<getStr (buf2dword (SUBSTR(lpResult, i*OFF_SET+5,4)))>>
\Print Server name <<getStr (buf2dword (SUBSTR(lpResult, i*OFF_SET+9,4)))>>
\User name <<getStr (buf2dword (SUBSTR(lpResult, i*OFF_SET+13,4)))>>
\Document <<getStr (buf2dword (SUBSTR(lpResult, i*OFF_SET+17,4)))>>
\Data type <<getStr (buf2dword (SUBSTR(lpResult, i*OFF_SET+21,4)))>>
\Job status <<getStr (buf2dword (SUBSTR(lpResult, i*OFF_SET+25,4)))>>
\Status <<buf2dword (SUBSTR(lpResult, i*OFF_SET+29,4))>>
\Priority <<buf2dword (SUBSTR(lpResult, i*OFF_SET+33,4))>>
\Position job in queue<<buf2dword (SUBSTR(lpResult, i*OFF_SET+37,4))>>
\Total pages <<buf2dword (SUBSTR(lpResult, i*OFF_SET+41,4))>>
\Pagfs printed <<buf2dword (SUBSTR(lpResult, i*OFF_SET+45,4))>>
\Date <<DATE(buf2word(SUBSTR(lpResult,i*OFF_SET+49,2)),buf2word(SUBSTR(lpResult,i*OFF_SET+51,2)),buf2word(SUBSTR(lpResult,i*OFF_SET+55,2)))>>
\day of week <<buf2word(SUBSTR(lpResult,i*OFF_SET+53,2))>>
\time <<buf2word(SUBSTR(lpResult,i*OFF_SET+57,2))>>:
\\<<buf2word(SUBSTR(lpResult,i*OFF_SET+59,2))>>:
\\<<buf2word(SUBSTR(lpResult,i*OFF_SET+61,2))>>:
\\<<buf2word(SUBSTR(lpResult,i*OFF_SET+63,2))>>

\-------------------------------------------
NEXT
=FCLOSE(_TEXT)
=CloseHandle(hPrn)
MODIFY FILE c:\printqueue.txt
RETURN

FUNCTION buf2dword (lcBuffer)
RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ;
BITLSHIFT(ASC(SUBSTR(lcBuffer, 2,1)), 8) +;
BITLSHIFT(ASC(SUBSTR(lcBuffer, 3,1)), 16) +;
BITLSHIFT(ASC(SUBSTR(lcBuffer, 4,1)), 24)

FUNCTION num2dword (lnValue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
LOCAL b0, b1, b2, b3
b3 = INT(lnValue/m2)
b2 = INT((lnValue - b3*m2)/m1)
b1 = INT((lnValue - b3*m2 - b2*m1)/m0)
b0 = MOD(lnValue, m0)
RETURN CHR(b0)+CHR(b1)+CHR(b2)+CHR(b3)

FUNCTION buf2word (lcBuffer)
RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ;
ASC(SUBSTR(lcBuffer, 2,1)) * 256

FUNCTION getStr (lnAddr)
LOCAL lcBuffer
lcBuffer = REPLI(CHR(0), 128)
= CopyMemory (@lcBuffer, lnAddr, LEN(lcBuffer))
IF AT(CHR(0), lcBuffer) <> 0
lcBuffer = SUBSTR(lcBuffer, 1, AT(CHR(0), lcBuffer)-1)
ENDIF
RETURN lcBuffer

FUNCTION _systemtime (lcBuffer)
wYear = buf2word (SUBSTR(lcBuffer, 1, 2))
wMonth = buf2word (SUBSTR(lcBuffer, 3, 2))
wDay = buf2word (SUBSTR(lcBuffer, 7, 2))
wHour = buf2word (SUBSTR(lcBuffer, 9, 2))
wMinute = buf2word (SUBSTR(lcBuffer, 11, 2))
wSecond = buf2word (SUBSTR(lcBuffer, 13, 2))

lcStoredSet = SET ("DATE")
SET DATE TO MDY

lcDate = STRTRAN (STR(wMonth,2) + "/" + STR(wDay,2) +;
"/" + STR(wYear,4), " ","0")

lcTime = STRTRAN (STR(wHour,2) + ":" + STR(wMinute,2) +;
":" + STR(wSecond,2), " ","0")

ltResult = CTOT (lcDate + " " + lcTime)
SET DATE TO &lcStoredSet
RETURN ltResult
...
Рейтинг: 0 / 0
кол-во заданий в очереди принтера
    #32257947
nataSid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО ВСЕМ!
РАБОТАЕТ!!!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / кол-во заданий в очереди принтера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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