|
|
|
||||||||||||
|
|
Собственный, легко управляемый и профессионально разработанный сайт – необходимый элемент любого бизнеса. Находитесь ли Вы в командировке, в дороге, дома или на отдыхе имея компьютер, подключенный к сети Internet, Вы получаете доступ к управлению Вашим сайтом! |
|||
Visual Basic - Получаем состояние выбранного принтераСтатьи → Программирование на VisualBasicОдна из проблематичных частей разработки профессиональнальных приложений в Visual Basic, это добавление в программу возможности печати. С появлением Visual Basic 4 у разработчиков появилась возможность пользоваться новым объектом Printer. Однако, у этого объекта есть серьёзнае недостатки, а именно, невозможно узнать готов принтер к печати или занят, вставлена в него бумага или нет и т.д. Поэтому для получения такой информации можно воспользоваться API функцией GetPrinter. Private Declare Function GetPrinterApi Lib "winspool.drv" Alias _ Используя дескриптор принтера hPrinter она заполняет буфер информацией из драйвера принтера. Чтобы получить дескриптор из объекта Printer, нам необходимо воспользоваться API функцией OpenPrinter. Private Type PRINTER_DEFAULTS Private Declare Function OpenPrinter Lib "winspool.drv" _ Private Declare Function ClosePrinter Lib "winspool.drv" _ А вот как выглядит код получения дескриптора принтера. Dim lret As Long lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef) 2. Различные состояния принтера Драйвер принтера может вернуть различные стандартные состояния принтера. Public Enum Printer_Status 3. Структура данных Существуют несколько разных структур данных, которые возвращает драйвер принтера (в Windows 2000, например, их девять штук), однако только две первые являются наиболее универсальными и подходят для всех версий Windows. Из них вторая является наиболее интересной для нас (PRINTER_INFO_2) Private Type PRINTER_INFO_2 Однако, не достаточно просто передать эту структуру в API функцию GetPrinter, так как принтер может вернуть больше информации, чем размер структуры. Поэтому, если не зарезервировать достаточного буфера для неё, программа может "выполнить недопустимую оперцию". Dim lret As Long Dim buffer() As Long ReDim Preserve buffer(0 To 1) As Long Однако, мы выделили буфер значений Long, а некоторые значения в структуре PRINTER_INFO_2 имеют тип данных String. Поэтому, необходимо получить эти строковые данные из соответствущих адресов буфера. Для получения строки по указанному адресу, используется API функция CopyMemory. Текже существует API функция IsBadStringPtr, которая используется для проверки того, что по указанному адресу содержится допустимая строка. '\\ Функции работы с памятью Получение строки по указателю, это обычная вещь, поэтому такую функцию нужно всегда иметь в своём арсенале. Public Function StringFromPointer(lpString As Long, lMaxLength As Long) As String Dim sRet As String If lpString = 0 Then If IsBadStringPtrByLong(lpString, lMaxLength) Then '\\ Подготовка к получению строки... StringFromPointer = sRet End Function А теперь используем эту функцию, чтобы заполнить нашу переменную PRINTER_INFO_2: With mPRINTER_INFO_2 '\\ Эта переменная типа PRINTER_INFO_2 Источник: http://codenet.ru 16.02.2006 |
VSESMI.ru — новости в СМИ.
Tur-Hotel.ru — отзывы об отелях
|
|
Copyright © 2002—2010 ООО "Хостмэйк" Телефон в Москве: +7 (495) 223-46-50 Телефон в Санкт-Петербурге: +7 (812) 448-38-90 Тел./Факс: +7 (8636) 237-836 E-mail: 2006 |