Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Какую SCADA используете Вы?
Диалог специалистов АВОК > ОБЩИЙ ФОРУМ > Автоматизация систем
Страницы: 1, 2, 3
s60
Цитата(ggg__ggg @ 28.8.2008, 12:04) [snapback]286220[/snapback]
Есть такой ключик в реестре - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping. Он много чего интересного содержит, в том числе и про принтеры.

благодарю за ссылку на ключик - откопал статейку в масть (НО сложнее чем на WHS да строк в сто раз больше)
--------------------------------------------------------------------------------------------------------------------------------

Смена активного принтера в Windows 2000 средствами Visual Basic
Статьи → Программирование на VisualBasic

Проблему программного изменения активного принтера можно по праву отнести в раздел FAQ - часто задаваемых вопросов, настолько часто о ней задаются вопросы в форумах и почтовых конференциях. Данный материал, основанный на информации из Microsoft Knowlegde Base, детализирует решение этой проблемы для Windows NT/Windows 2000, а также для Win9x.

Традиционный подход к установке принтера "по умолчанию", который должен работать согласно документации, состоит в том, чтобы, перебирая коллекцию Printers, найти требуемый принтер и назначить его объекту Printer. На самом деле это не работает как заявлено. Название принтера изменится, но вывод будет производиться на первоначальное устройство, которое до этого использовалось по умолчанию.

В Win9x установленные принтеры перечислены в win.ini в разделе PrinterPorts, принтер по умолчанию указан в разделе Device. Поэтому различная документация просто предлагает изменить значения этого ключа. Но если вы посмотрите содержимое win.ini в системе WinNT/2000, то обнаружите, что файл не содержит никакой информации об установленных и активном принтерах.

По умолчанию, при использовании GetProfileString / WriteProfileString или GetPrivateProfileString / WritePrivateProfileString под WinNT/2000, API сначала смотрит значения системного реестра в секции:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping

в поисках ini-файла. Если значение не было найдено, то используется "физический" ini-файл.

В случае, если подключ win.ini был найден в системном реестре под ключом, указанным выше, то далее проверяется значение PrinterPorts, которое указывает, где в реестре хранятся данные об установленных принтерах (например, "USR:Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts").

Найдя данный ключ, вы увидите перечень принтеров, которые доступны на данном компьютере. Таким образом, используя функции работы с реестром можно получить данные о принтерах прямо отсюда, а не из обычного текстового файла конфигурации, как в Win9x. Обратите внимание, перед их использованием, что смена активного принтера произойдет во всей системе, а не только в вашем приложении. Поэтому после смены принтера было бы логичнее создать функцию, позволяющую восстановить первоначальные настройки системы перед завершением работы вашей программы.

Чтобы на деле увидеть как работать с описываемыми ключами, ниже приводится готовый пример. Создайте новый проект, добавьте на его форму список List1 и кнопку Command1. Затем запустите проект, откройте папку "Printers" (в русских версиях - "Принтеры") и нажимая на кнопку, смотрите как изменяется активный принтер.

Option Explicit

Private Const HWND_BROADCAST As Long = &HFFFF
Private Const WM_WININICHANGE As Long = &H1A

Private Declare Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long

Private Declare Function WriteProfileString Lib "kernel32" _
Alias "WriteProfileStringA" _
(ByVal lpszSection As String, _
ByVal lpszKeyName As String, _
ByVal lpszString As String) As Long

Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lparam As Any) As Long

Private Sub Form_Load()
ProfileLoadWinIniList List1, "PrinterPorts"
Command1.Enabled = False
End Sub

Private Sub Command1_Click()
Call SetDefaultPrinterWinNT
End Sub

Private Sub List1_Click()
Command1.Enabled = List1.ListIndex > -1
End Sub

Private Sub SetDefaultPrinter(ByVal PrinterName As String, _
ByVal DriverName As String, _
ByVal PrinterPort As String)
Dim DeviceLine As String

'Строим строку для принтера
DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort

'Сохранить информацию о новом принтере в секции
'[WINDOWS] файла WIN.INI для ключа DEVICE=
Call WriteProfileString("windows", "Device", DeviceLine)

'Заставить все приложения перезагрузить INI-файл
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ByVal "windows")

End Sub

Private Sub GetDriverAndPort(ByVal Buffer As String, _
DriverName As String, PrinterPort As String)

Dim posDriver As Long
Dim posPort As Long
DriverName = ""
PrinterPort = ""

'Имя драйвера идет вначале строки
posDriver = InStr(Buffer, ",")

If posDriver > 0 Then
'Получение имени драйвера
DriverName = Left(Buffer, posDriver - 1)
'Имя порта идет после запятой
posPort = InStr(posDriver + 1, Buffer, ",")

If posPort > 0 Then
'Получение имени порта
PrinterPort = Mid(Buffer, posDriver + 1, _
posPort - posDriver - 1)
End If
End If

End Sub

'Создаем listbox из данных win.ini
Public Function ProfileLoadWinIniList(lst As ListBox, _
lpSectionName As String) As Long

Dim success As Long
Dim nSize As Long
Dim lpKeyName As String
Dim ret As String

ret = Space$(8102)
nSize = Len(ret)
success = GetProfileString(lpSectionName, vbNullString, _
"", ret, nSize)

'Возращаемая строка является списком, разделенным
'нулевыми символами
If success Then

ret = Left$(ret, success)
Do Until ret = ""
lpKeyName = StripNulls(ret)
lst.AddItem lpKeyName
Loop

End If

'вернем число принтеров (кол-во элементов)
ProfileLoadWinIniList = lst.ListCount

End Function

Private Function StripNulls(startstr As String) As String

Dim pos As Long

pos = InStr(startstr$, Chr$(0))

If pos Then
StripNulls = Mid$(startstr, 1, pos - 1)
startstr = Mid$(startstr, pos + 1, Len(startstr))
End If

End Function

Private Sub SetDefaultPrinterWinNT()

Dim Buffer As String
Dim DeviceName As String
Dim DriverName As String
Dim PrinterPort As String
Dim PrinterName As String
Dim r As Long

If List1.ListIndex > -1 Then

'Получить информацию из файла WIN.INI о принтере,
'выделенном в списке.
Buffer = Space(1024)
PrinterName = List1.Text

Call GetProfileString("PrinterPorts", _
PrinterName, "", _
Buffer, Len(Buffer))

'Получить имя драйвера и порта
GetDriverAndPort Buffer, DriverName, PrinterPort

If DriverName "" And PrinterPort "" Then
SetDefaultPrinter List1.Text, DriverName, PrinterPort
End If

End If

End Sub
--------------------------------------------------------------------------------------------------------------------------------

взято тут
s60
все же один очевидный плюс у RSView32 есть - встроенная самодокументация проекта... как минимум экраны в картинки jpg не надо самому сохранять...
ARTEM_1

Не согласен на личном опыте проверено сто 100 мс отлично проходит сигнал без задержек и подвисаний . У меня на печи плавления стоит в визуализации WinCC на ней стянуты все парамеиры от термопар и всё гут и одновременно пишется лог каждые 100мс . rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.