Надо узнать состояние LPT принтера
Пытался сначала работать со структурой PRINTER_INFO_2 + ф-ция GetPrinter, и смотреть поле PRINTER_INFO_2::Status, но тут всё время возвращается неопределённое состояние 0 (вызов GetPrinter выполняется успешно). Искал в гугле — у всех таже проблема, а ответа нет.
Сейчас пытаюсь открывать LPT принтер, и узнавать его сотояние с помощью ф-ции DeviceIoControl. Но здесь тоже траблы.
Делаю так:
#include <WinIOCtl.h>
#define PARALLEL_AUTOFEED 0x02
#define PARALLEL_PAPER_EMPTY 0x04
#define PARALLEL_OFF_LINE 0x08
#define PARALLEL_POWER_OFF 0x10
#define PARALLEL_NOT_CONNECTED 0x20
#define PARALLEL_BUSY 0x40
#define PARALLEL_SELECTED 0x80
#define IOCTL_PAR_QUERY_INFORMATION CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
BOOL PrinterStatus(OUT CString &strStatus) {
strStatus.Empty();
BOOL bRes = FALSE;
// пробую напрямую читать из LPT порта
HANDLE hLpt = ::CreateFile(_T("LPT1"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hLpt == INVALID_HANDLE_VALUE)
{
DWORD dwErrCode1 = ::GetLastError();
} else {
PAR_QUERY_INFORMATION ParInfo;
DWORD dwRes = 0;
bRes = ::DeviceIoControl(hLpt, IOCTL_PAR_QUERY_INFORMATION, NULL, 0, &ParInfo, sizeof(ParInfo), &dwRes, NULL);
if (!bRes) {
DWORD dwErrCode2 = ::GetLastError();
} else {
if (ParInfo.Status & PARALLEL_INIT ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_INIT" ); }
if (ParInfo.Status & PARALLEL_AUTOFEED ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_AUTOFEED" ); }
if (ParInfo.Status & PARALLEL_PAPER_EMPTY ) { bRes &= FALSE; strStatus += _T(" | PARALLEL_PAPER_EMPTY" ); }
if (ParInfo.Status & PARALLEL_OFF_LINE ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_OFF_LINE" ); }
if (ParInfo.Status & PARALLEL_POWER_OFF ) { bRes &= FALSE; strStatus += _T(" | PARALLEL_POWER_OFF" ); }
if (ParInfo.Status & PARALLEL_NOT_CONNECTED) { bRes &= FALSE; strStatus += _T(" | PARALLEL_NOT_CONNECTED"); }
if (ParInfo.Status & PARALLEL_BUSY ) { bRes &= FALSE; strStatus += _T(" | PARALLEL_BUSY" ); }
if (ParInfo.Status & PARALLEL_SELECTED ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_SELECTED" ); }
if (!strStatus.IsEmpty()) strStatus = strStatus.Mid(3);
}
::CloseHandle(hLpt); hLpt = NULL;
}
return bRes;
}
Этот код опроса LPT порта на 2х машинах с WinXP Profi + SP2 без принтера и на машине с Win2K Profi + SP4 с USB принтером отработался успешно — возвращается FALSE со строкой strStatus == "PARALLEL_POWER_OFF | PARALLEL_BUSY | PARALLEL_SELECTED".
А на машине с Win2K Profi + SP4 c LPT принтером и на др. машине с Win2K Server + SP4 без принтера не работает — ф-ция DeviceIoControl ругается — GetLastError возвращает ERROR_INVALID_FUNCTION.
Может кто-то подскажет в чём проблема?
Ну чтож, проблему пока не решил. Но расказать хочу о следующем.
Т.к. описания в SDK по ф-ции DeviceIoControl мне показалось маловато, а о IOCTL_PAR_QUERY_INFORMATION там вообще упоминаний нет, то решил выкачать DDK (на раскладках в Киеве ненашёл).
Залез на microsoft.com, думал выкачаю. Ненашёл
. Но предлагают за 10$ на CD.
Ну, думаю, позвоню в представительство Microsoft в Украине. Позвонил шеф, ему ответили — незнаем такого продукта. Обьяснили им что это за продукт, что на головном сайте он есть, что даже продают его за 10$. Отвечают — узнаем и перезвоним. Перезвонили, говорят а какой его идентификационный номер продажи. Отвечаем — х.з. нет на головном сайте номера. Ну, тогда говорят, нет такого продукта у Microsoft...
Вот такие пироги, вот такие менеджеры в Киеве в Microsoft'e. Нет слов — одни ... выражения!
Может кто-то знает где выкачать этот грёбаный DDK?
Здравствуйте, SeregaLBN, Вы писали:
SLB>Ну чтож, проблему пока не решил. Но расказать хочу о следующем.
SLB>Т.к. описания в SDK по ф-ции DeviceIoControl мне показалось маловато, а о IOCTL_PAR_QUERY_INFORMATION там вообще упоминаний нет, то решил выкачать DDK (на раскладках в Киеве ненашёл).
SLB>Залез на microsoft.com, думал выкачаю. Ненашёл . Но предлагают за 10$ на CD.
SLB>Ну, думаю, позвоню в представительство Microsoft в Украине. Позвонил шеф, ему ответили — незнаем такого продукта. Обьяснили им что это за продукт, что на головном сайте он есть, что даже продают его за 10$. Отвечают — узнаем и перезвоним. Перезвонили, говорят а какой его идентификационный номер продажи. Отвечаем — х.з. нет на головном сайте номера. Ну, тогда говорят, нет такого продукта у Microsoft...
SLB>Вот такие пироги, вот такие менеджеры в Киеве в Microsoft'e. Нет слов — одни ... выражения!
SLB>Может кто-то знает где выкачать этот грёбаный DDK?
Какой именно DDk?
...Мы будем драться до конца!... (Ария)