Длина строки имени принтера из структуры

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
rodnoi
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 24.06.2004 (Чт) 12:13

Длина строки имени принтера из структуры

Сообщение rodnoi » 27.10.2006 (Пт) 17:03

При организации диалога выбора принтера использую структуру

Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32
Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type

из этой структуры получаю dmDeviceName,ограниченное 32 символами, а как быть,если имя принтера длиннее? Кто-нибудь сталкивался с такой проблемой?

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 27.10.2006 (Пт) 19:13

1. А разве бываеют такие принтеры, во всяком случае, в сети?
2. возможно, что надо использовать версии функций, работающих с юникодом, соответсвенно, и видоизменённые структуры

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 27.10.2006 (Пт) 20:17

При организации диалога выбора принтера использую структуру

Юзай OCX от мелкомягких и не запаривайся. + тебе, по идее нужно не имя а hDC принтера.
Изображение

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.10.2006 (Сб) 6:24

Alexanbar писал(а):2. возможно, что надо использовать версии функций, работающих с юникодом, соответсвенно, и видоизменённые структуры


Версия для Unicode так же имеет соответствующее поле dmDeviceName размером 32 символа, так же как и версия ANSI.

Для автора привожу перевод описания члена dmDeviceName структуры DEVMODE.

MSDN писал(а):Определяет "дружественное" имя принтера или дисплея; например, "PCL/HP LaserJet" для принтера PCL/HP LaserJet. Эта строка является уникальной среди драйверов устройств. Заметим, что это имя может быть обрезано для соответствия размерам массива dmDeviceName.
Весь мир матрица, а мы в нем потоки байтов!

rodnoi
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 24.06.2004 (Чт) 12:13

Сообщение rodnoi » 31.10.2006 (Вт) 11:57

А ведь можно определить имя принтера больше 32 символов, используя структуру DevNames! Вот главный кусок

'Set the current driver, device, and port name strings
With DevName
.wDriverOffset = 8
.wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
.wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
.wDefault = 0
'''
If Len(Printer.DeviceName) > 32 Then
.wOutputOffset = .wDeviceOffset + 32
Else
.wOutputOffset = .wDeviceOffset + 1 + Len(Printer.DeviceName)
End If
.wDefault = 0
End With

With Printer
DevName.extra = .DriverName & Chr(0) & .DeviceName & Chr(0) & .Port & Chr(0)
End With


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 6

    TopList