powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Возможно ли программно установить модем?
11 сообщений из 11, страница 1 из 1
Возможно ли программно установить модем?
    #35774367
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. без панели управления и без запуска "мастера".
Конкретно "Стандартный модем 14400"
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #35775735
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если данные подготавливаются, передаются -принимаются из VB, то модем можно не устанавливать. Просто добавить ComCtrl.осх, определить компорт-скорость и далее АТ командами набирать номер или устанавливать соединение для выделенки, и после коннекта передавать -принимать инфу. Ну и тут-же в проге обрабатывать.
Как установить драйвер - не знаю.
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #35775741
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не то.
Работать с MSCOMM32.ocx я умею, если вы что-то в этом духе имели ввиду.
Я это дело давно использую для управления "через терминалку".

Здесь другое...сам процесс передачи как и что меня в данном случае не интересует.
Данные передаются-принимаюся программой microsoft fax, интерфейс самого порта предоставляется программой на c++. Модем нужен , т.к. Microsoft Fax с портами "напрямую" не работает.

Задача облегчается тем, что прога, которая должна установить модем точно знает на какой порт, +модем "стандартный", т.е. система его знает "в лицо" по определению.
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #35775764
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сути нужно вот это:
http://support.microsoft.com/kb/194941
First, create a valid Windows NT 4.0 unattended install file. This file must have a [<Modem_Parameter_Section>] section for the modem you are installing. For example:
[MyModem]
COM1 = "Dial-Up Networking Serial Cable between 2 PCs"
To call the Modem Control Panel Applet from the command line, use the following syntax:
rundll32.exe shell32.dll,Control_RunDLL modem.cpl,Modems,
noui inf=<INF_FileName> sect=<Modem_Parameter_Section>
Where the above command is one line, with no space between "Modems," and "noui". For example (if the example above was saved as c:\MyModem.inf):
rundll32.exe shell32.dll,Control_RunDLL modem.cpl,Modems, noui inf=c:\MyModem.INF sect=MyModem


Но работает оно у меня только до этого места(эту команду я и так знал)
rundll32.exe shell32.dll,Control_RunDLL modem.cpl,Modems
и выводит вкладку модемы.
Пока все что нарыл, там вообще не написано что это в xp и 2003 работать должно...
Может с синтаксисом копаться надо, пока никак...
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #35776491
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, собственно и решение.
http://support.microsoft.com/kb/304294
Скачиваем exe, кладем распакованное содержимое в c:\modem
Запускаем DDK->Windows 2000 Free Build Environment
(вот,блин не могу понять чем они отличаются? )
Делаем
Код: plaintext
1.
2.
c:
cd c:\modem
make (прям как в линуксе!)
В папке C:\modem\objfre_w2k_x86\i386 обнаруживаем искомое, т.е. MdmInst.exe
Долго мудохаемся и ругаемся, в конце концов делаем это:
1) Открываем файл MdmInst.с (в VC++ 2005 , естественно)
2) Убираем там ф-цию проверки номера COM-порта на предмет железности (прога по умолчанию ставит модемы только на реальные железные порты, на виртуальные ей наплевать)
3) Убираем проверку, что такой модем уже есть. (Т.е. если уже установлен Стандартный модем 14400, то прога по умолчанию Стандартный модем 14400 #2 ставить не хочет, просто обновляет существующий модем, что неправильно, то что он на другом порту ей наплевать)
4) перекомпилируем это дело заново
5) файл MdmInst.exe кидаем в system32 (если этого не сделать будут некоторые глюки)

Короче "Стандартный модем 14400 bps" на порт COM10 устанавливается следующей командой:
Код: plaintext
mdminst %windir%\inf\mdmgen.inf COM10 mdmgen144
где mdmgen.inf -стандартный win-modem-inf с информацией о стандартном модеме 14400 mdmgen144
А, ну да
Код: plaintext
1.
2.
ShellAndContinue "mdminst %windir%\inf\mdmgen.inf COM10 mdmgen144", vbHide
Shell "rundll32.exe shell32.dll,Control_RunDLL Modem.cpl",vbNormalFocus 'надо ж удостовериться 
MsgBox "Вот мы его и установили!"
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #35791046
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОПС, и сразу 2 вопроса:
1) А как узнать какие модемы и на каких портах установлены?
2) А как удалить конкретный модем?
Естественно не методом тупого опроса через com-порты...
Должны ж быть какие-нибудь API и скрипты панели управления...
Хотя... в XP Modem.cpl как таковой отсутствует и даже команда ,,Add не работает...
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #35791480
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Узнать кто где один способ нашел:
Win32_POTSModem Class
http://msdn.microsoft.com/en-us/library/aa394360(VS.85).aspx

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Command3_Click()
 Dim oWMI As Object, cItems As Object, oItem As Object
    Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set cItems = oWMI.ExecQuery("Select * From Win32_POTSModem")
    
    For Each oItem In cItems
        Debug.Print oItem.AttachedTo & ": " & oItem.Name & " " & oItem.ModemInfSection
    Next
    
    Set cItems = Nothing
    Set oWMI = Nothing
End Sub
Удалить похоже с использованием этого не удастся, по крайней мере можно понять чего на каком порту удалять, и чего на каком порту уже существует, потому как из mdminst код проверки порта и существования модема пришлось выкинуть, ибо он там некорректный, т.е. без проверки mdminst у меня может наставить 10 модемов на один порт, что неправильно.

Интересно, этот WMI в любой системе всегда присутствует?...
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #35792027
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/en-us/library/dd163210.aspx
Пошел искать исходники, вместо исходников нашел откомпилированный exe-шник:
\WINDDK\3790.1830\tools\devcon\i386\devcon.exe
Итого, выводим DeviceID через WMI:
Код: plaintext
1.
2.
    For Each oItem In cItems
        str = str & oItem.AttachedTo & ": " & oItem.Name & " " & oItem.ModemInfSection & " " & oItem.DeviceID & vbCrLf
    Next
Имеем, например:
COM10: Стандартный модем 14400 bps #2 Gen144 ROOT\MODEM\0003
Тупо даем команду:
Код: plaintext
1.
2.
C:\ 111 >devcon.exe remove @ROOT\MODEM\ 0003 
ROOT\MODEM\ 0003                                              : Removed
 1  device(s) removed.
И усе, нету.
Наиболее интересной является команда
Код: plaintext
1.
2.
devcon.exe [-r] remove <id> [<id>...]
Examples of <id> are:
*                  - All devices (not recommended)
...не пробовал
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Возможно ли программно установить модем?
    #38649711
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну вот, собственно и решение.
http://support.microsoft.com/kb/304294
Дебильный этот пример.
Он использует UpdateDriverForPlugAndPlayDevices .
Подлость этой ф-ции в том, что она обновляет драйвера всех модемов с заданным HardwareID, в том числе и ранее установленных. А если их уже 50, а надо доустановить 51-й, то это Ж, даже если вызывать ее один раз (как я наловчился делать).
Надо использовать InstallSelectedDriver function , а UpdateDriverForPlugAndPlayDevices использовать только для страховки (когда драйвера еще нет в системе).
Короче нарисовал нормальный код на VB6. Полный пример приложил.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
Option Explicit

Public Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type

Public Const ERROR_KEY_DOES_NOT_EXIST = 2
Public Const ERROR_INSUFFICIENT_BUFFER = 122&
Public Const INVALID_HANDLE_VALUE = -1

'Device Installation Structures
Public Type SP_DEVINFO_DATA
  cbSize As Long
  ClassGuid As GUID
  DevInst As Long
  Reserved As Long
End Type

Public Const LINE_LEN = 256

Public Type SP_DRVINFO_DATA
  cbSize As Long
  DriverType As Long
  Reserved As Long
  Description As String * LINE_LEN
  MfgName As String * LINE_LEN
  ProviderName As String * LINE_LEN
  DriverDate As FILETIME
  DriverVersion_part1 As Long 'DWORDLONG -одного Long недостаточно!
  DriverVersion_part2 As Long
End Type

'Public Device Installation Functions

Public Const DI_NEEDREBOOT = &H100

Public Declare Function InstallSelectedDriver Lib "newdev.dll" _
 (ByVal hWndParent As Long, ByVal DeviceInfoSet As Long, _
 ByVal Reserved As Long, ByVal Backup As Long, ByRef bReboot As Long) As Boolean

'DriverType - The type of driver list to build.
Public Const SPDIT_COMPATDRIVER = &H2

Public Declare Function SetupDiBuildDriverInfoList Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, _
 ByVal DriverType As Long) As Boolean

'Device Installation Function Codes
Public Const DIF_REMOVE = &H5
Public Const DIF_SELECTBESTCOMPATDRV = &H17

Public Declare Function SetupDiCallClassInstaller Lib "setupapi.dll" _
 (ByVal InstallFunction As Long, _
 ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA) As Boolean

'CreationFlags - controls how the device information element is created
Public Const DICD_GENERATE_ID = 1

Public Declare Function SetupDiCreateDeviceInfo _
 Lib "setupapi.dll" Alias "SetupDiCreateDeviceInfoA" _
 (ByVal DeviceInfoSet As Long, _
 ByVal DeviceName As String, ByRef ClassGuid As GUID, _
 ByVal DeviceDescription As String, ByVal hWndParent As Long, _
 ByVal CreationFlags As Long, ByRef DeviceInfoData As SP_DEVINFO_DATA) As Boolean
 
Public Declare Function SetupDiCreateDeviceInfoList Lib "setupapi.dll" _
 (ByRef ClassGuid As GUID, Optional ByVal hWndParent As Long) As Long
 
'Scope - where the information is stored. The key created can be global or hardware profile-specific.
Public Const DICS_FLAG_GLOBAL = &H1
'KeyType -The type of registry storage key to create.
Public Const DIREG_DRV = 2

Public Declare Function SetupDiCreateDevRegKey _
 Lib "setupapi.dll" Alias "SetupDiCreateDevRegKeyA" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Scope As Long, _
 ByVal HwProfile As Long, ByVal KeyType As Long, ByVal InfHandle As Long, _
 ByVal InfSectionName As String) As Long
 
Public Declare Function SetupDiDestroyDeviceInfoList Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long) As Boolean
Public Declare Function SetupDiGetINFClass Lib "setupapi.dll" Alias "SetupDiGetINFClassA" _
 (ByVal InfName As String, ByRef ClassGuid As GUID, _
 ByVal ClassName As String, ByVal ClassNameSize As Long, _
 Optional ByRef RequiredSize As Long) As Boolean
'!!!с SetupDiGetSelectedDriverA -определенные проблемы из-за String*XXX
Public Declare Function SetupDiGetSelectedDriver _
 Lib "setupapi.dll" Alias "SetupDiGetSelectedDriverW" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByRef DriverInfoData As SP_DRVINFO_DATA) As Boolean
Public Declare Function SetupDiOpenDevRegKey Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Scope As Long, _
 ByVal HwProfile As Long, ByVal KeyType As Long, ByVal samDesired As Long) As Long
Public Declare Function SetupDiRegisterDeviceInfo Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Flags As Long, _
 ByVal CompareProc As Long, ByVal CompareContext As Long, ByRef DupDeviceInfoData As Long) As Boolean 'Optional параметры опускаем
 
'Property - identifies the property to be set
Public Const SPDRP_HARDWAREID = 1 'REG_MULTI_SZ string that contains the list of hardware IDs for a device
 
Public Declare Function SetupDiSetDeviceRegistryProperty _
 Lib "setupapi.dll" Alias "SetupDiSetDeviceRegistryPropertyA" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Property As Long, _
 ByVal PropertyBuffer As Long, ByVal PropertyBufferSize As Long) As Boolean
Public Declare Function SetupDiSetSelectedDevice Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA) As Boolean
 
'InstallFlags -A caller-supplied value
Public Const INSTALLFLAG_FORCE = &H1

Public Declare Function UpdateDriverForPlugAndPlayDevices _
 Lib "newdev.dll" Alias "UpdateDriverForPlugAndPlayDevicesA" _
 (ByVal hWndParent As Long, ByVal HardwareId As String, _
 ByVal FullInfPath As String, ByVal InstallFlags As Long, _
 Optional ByRef bRebootRequired As Boolean) As Boolean

Public Function InstallModem(ByVal INF_File As String, _
 ByVal COM_Port As String, ByVal Hardware_ID As String, _
 ByRef RebootRequired As Boolean) As Boolean
  'INF_File -путь к inf-файлу (напр. C:\111\mdmgen.inf)
  'COM_Port -порт, на кот. устанавливаем (напр. COM35)
  'Hardware_ID -напр. mdmgen144
  'RebootRequired-возвращается true если нужна перезагрузка
  
  Dim bResult As Boolean
  Dim m_ClassGUID As GUID
  Dim m_ClassName As String
  Dim ReqSize As Long
  Dim hDeviceInfoSet As Long
  Dim m_DeviceInfoData As SP_DEVINFO_DATA
  Dim bRemove As Boolean
  Dim hKeyDev As Long
  Dim dwRet As Long
  Dim m_DriverInfoData As SP_DRVINFO_DATA
  
  ' Use the INF File to extract the Class GUID
  bResult = SetupDiGetINFClass(INF_File, m_ClassGUID, m_ClassName, 0, ReqSize)
  If (bResult = False) And (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then
    m_ClassName = String(ReqSize, 0)
    bResult = SetupDiGetINFClass(INF_File, m_ClassGUID, m_ClassName, ReqSize)
    If bResult = False Then
      Debug.Print "SetupDiGetINFClass Error " & RaiseAPIErrorByNumber(Err.LastDllError)
      Exit Function
    Else
      m_ClassName = Left(m_ClassName, InStr(m_ClassName, Chr(0)) - 1)
      Debug.Print "m_ClassName=" & m_ClassName
    End If
  Else
    Debug.Print "SetupDiGetINFClass Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    Exit Function
  End If
  
  ' Create the container for the to-be-created Device Information Element
  hDeviceInfoSet = SetupDiCreateDeviceInfoList(m_ClassGUID)
  If hDeviceInfoSet = INVALID_HANDLE_VALUE Then
    Debug.Print "SetupDiCreateDeviceInfoList Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    Exit Function
  End If
  Debug.Print "hDeviceInfoSet=" & hDeviceInfoSet
  
  ' Now create the element. Use the Class GUID and Name from the INF file.
  m_DeviceInfoData.cbSize = LenB(m_DeviceInfoData)
  bResult = SetupDiCreateDeviceInfo(hDeviceInfoSet, m_ClassName, m_ClassGUID, _
   vbNullString, 0&, DICD_GENERATE_ID, m_DeviceInfoData)
  If bResult = False Then
    Debug.Print "SetupDiCreateDeviceInfo Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo Cleanup
  End If
  
  ' Add the HardwareID to the Device's HardwareID property.
  bResult = SetupDiSetDeviceRegistryProperty(hDeviceInfoSet, m_DeviceInfoData, SPDRP_HARDWAREID, _
   StrPtr(StrConv(Hardware_ID, vbFromUnicode)), Len(Hardware_ID) + 2)
  If bResult = False Then
    Debug.Print "SetupDiSetDeviceRegistryProperty Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo Cleanup
  End If
  
  bResult = SetupDiRegisterDeviceInfo(hDeviceInfoSet, m_DeviceInfoData, 0&, 0&, 0&, 0&)
  If bResult = False Then
    Debug.Print "SetupDiRegisterDeviceInfo 1 Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    bRemove = True
    GoTo Cleanup
  End If
  
  hKeyDev = SetupDiOpenDevRegKey(hDeviceInfoSet, m_DeviceInfoData, _
   DICS_FLAG_GLOBAL, 0&, DIREG_DRV, KEY_ALL_ACCESS)
  If (hKeyDev = INVALID_HANDLE_VALUE) Then 'This call fails....
    hKeyDev = SetupDiCreateDevRegKey(hDeviceInfoSet, m_DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, 0, vbNullString)
    If hKeyDev = INVALID_HANDLE_VALUE Then
      Debug.Print "SetupDiCreateDeviceInfoList Error " & RaiseAPIErrorByNumber(Err.LastDllError)
      bRemove = True
      GoTo Cleanup
    End If
  End If
  Debug.Print "hKeyDev=" & hKeyDev
  
  dwRet = RegSetValueEx(hKeyDev, "AttachedTo", 0&, REG_SZ, COM_Port, CLng(Len(COM_Port) + 1))
  RegCloseKey hKeyDev
  If dwRet <> ERROR_SUCCESS Then
    Debug.Print "RegSetValueEx Error " & RaiseAPIErrorByNumber(dwRet)
    bRemove = True
    GoTo Cleanup
  End If
  
  bResult = SetupDiRegisterDeviceInfo(hDeviceInfoSet, m_DeviceInfoData, 0&, 0&, 0&, 0&)
  If bResult = False Then
    Debug.Print "SetupDiRegisterDeviceInfo 2 Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    bRemove = True
    GoTo Cleanup
  End If
  
  ' Install the Driver
  ' http://support.microsoft.com/kb/889763/ru
  ' первая попытка (InstallSelectedDriver) - устанавливаем драйвер только для данного девайса
  ' в расчете на то что сам драйвер уже установлен в системе
  
  ' InstallSelectedDriver works on the selected device and on the
  ' selected driver on that device. Therefore, set this device as the
  ' selected one in the device information list.
  bResult = SetupDiSetSelectedDevice(hDeviceInfoSet, m_DeviceInfoData)
  If bResult = False Then
    Debug.Print "SetupDiSetSelectedDevice Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  ' Build up a Driver Information List.
  ' Build a compatible driver list, meaning only include the
  ' driver nodes that match one of the hardware or compatible Ids of
  ' the device.
  bResult = SetupDiBuildDriverInfoList(hDeviceInfoSet, m_DeviceInfoData, SPDIT_COMPATDRIVER)
  If bResult = False Then
    Debug.Print "SetupDiBuildDriverInfoList Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  ' Pick the best driver in the list of drivers that was built.
  bResult = SetupDiCallClassInstaller(DIF_SELECTBESTCOMPATDRV, hDeviceInfoSet, m_DeviceInfoData)
  If bResult = False Then
    Debug.Print "SetupDiCallClassInstaller Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  ' Get the selected driver node.
  ' Note: If this list does not contain any drivers, this call
  ' will fail with ERROR_NO_DRIVER_SELECTED.
  m_DriverInfoData.cbSize = LenB(m_DriverInfoData)
  bResult = SetupDiGetSelectedDriver(hDeviceInfoSet, m_DeviceInfoData, m_DriverInfoData)
  If bResult = False Then
    Debug.Print "SetupDiGetSelectedDriver Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  Dim dwRebootRequired As Long
  bResult = InstallSelectedDriver(0, hDeviceInfoSet, 0&, 0&, dwRebootRequired)
  If bResult = False Then
    Debug.Print "InstallSelectedDriver Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  Else
    If dwRebootRequired = DI_NEEDREBOOT Then RebootRequired = True
    InstallModem = True
    Debug.Print "InstallSelectedDriver OK."
    GoTo Cleanup
  End If
    
ForceInstall:
  'если драйвер еще не установлен (например при первой установке такого девайса)
  'то используем UpdateDriverForPlugAndPlayDevices с явным указанием INF-файла
  'избегаем использовать этот метод, т.к. он обновляет драйвера для всех
  'ранее установленных девайсов с таким же Hardware_ID, в чем нет необходимости
  bResult = UpdateDriverForPlugAndPlayDevices(0&, Hardware_ID, INF_File, _
   INSTALLFLAG_FORCE, RebootRequired)
  If bResult = False Then
    Debug.Print "UpdateDriverForPlugAndPlayDevices Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    bRemove = True
    GoTo Cleanup
  Else
    InstallModem = True
    Debug.Print "UpdateDriverForPlugAndPlayDevices OK."
    GoTo Cleanup
  End If
    
Cleanup:
  If bRemove Then
    ' Delete Device Instance that was registered using SetupDiRegisterDeviceInfo
    ' May through an error if Device not registered -- who cares??
    SetupDiCallClassInstaller DIF_REMOVE, hDeviceInfoSet, m_DeviceInfoData
  End If
  
  SetupDiDestroyDeviceInfoList hDeviceInfoSet
  
End Function
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #38649712
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересный вопрос следующий.
Чтобы установить модем на x64 системе надо компилировать этот код под x64,
а на VB6 это по определению невозможно (32 бит).

Даже не пробуя, понятно чего будет:
ERROR_IN_WOW64 The calling application is a 32-bit application that is attempting to execute in a 64-bit environment, which is not allowed. For more information, see Installing Devices on 64-Bit Systems.

Или можно извернуться?

Хотя скорее всего придется допиливать пример из C++ ссылка на кот. дана (нужно objfre_w2k_x86 и objfre_wnet_amd64).
...
Рейтинг: 0 / 0
Возможно ли программно установить модем?
    #38651949
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допилил код.
Доразобрался со структурами, для A-версий разумно объявлять строки как байтовые массивы фиксированной длины, убрал W-версии ф-ций (чтоб везде было A, а то бардак какой-то).
Задаю INF явно через m_DeviceInstallParams As SP_DEVINSTALL_PARAMS и DI_ENUMSINGLEINF
Теперь имеем "Установка только из указанного INF" (неважно, установлен ли уже подходящий драйвер в системе или еще нет).
Т.е. у меня теперь всегда работает InstallSelectedDriver (строго заданный драйвер на строго заданный девайс). UpdateDriverForPlugAndPlayDevices получается вообще не нужен.
Код по идее годится для установки любого драйвера если убрать специфическое для модема "AttachedTo".
Работает естественно только на 32-битных системах.
Для x64 к сожалению только C++ и компиляция в 64-битный код.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
Option Explicit

Public Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type

Public Const ERROR_KEY_DOES_NOT_EXIST = 2
Public Const ERROR_INSUFFICIENT_BUFFER = 122&
Public Const INVALID_HANDLE_VALUE = -1

'Device Installation Structures
Public Type SP_DEVINFO_DATA
  cbSize As Long
  ClassGuid As GUID
  DevInst As Long
  Reserved As Long
End Type

'Flags -Flags that control installation and user interface operations.
Public Const DI_ENUMSINGLEINF = &H10000
'FlagsEx -Additional flags that provide control over installation and user interface operations.
Public Const DI_FLAGSEX_ALLOWEXCLUDEDDRVS = &H800

Public Type SP_DEVINSTALL_PARAMS
  cbSize As Long
  Flags As Long
  FlagsEx As Long
  hWndParent As Long
  InstallMsgHandler As Long 'PSP_FILE_CALLBACK
  InstallMsgHandlerContext As Long 'PVOID
  FileQueue As Long 'HSPFILEQ
  ClassInstallReserved As Long 'ULONG_PTR
  Reserved As Long
  DriverPath(MAX_PATH - 1) As Byte ' A-version
End Type

Public Const LINE_LEN = 256

Public Type SP_DRVINFO_DATA
  cbSize As Long
  DriverType As Long
  Reserved As Long
  Description(LINE_LEN - 1) As Byte ' A-version
  MfgName(LINE_LEN - 1) As Byte ' A-version
  ProviderName(LINE_LEN - 1) As Byte ' A-version
  DriverDate As FILETIME
  DriverVersion(1) As Long 'DWORDLONG -одного Long недостаточно!
End Type

'Public Device Installation Functions

Public Const DI_NEEDREBOOT = &H100
Public Const DI_NEEDRESTART = &H80

Public Declare Function InstallSelectedDriver Lib "newdev.dll" _
 (ByVal hWndParent As Long, ByVal DeviceInfoSet As Long, _
 ByVal Reserved As Long, ByVal Backup As Long, ByRef bReboot As Long) As Boolean

'DriverType - The type of driver list to build.
Public Const SPDIT_COMPATDRIVER = &H2

Public Declare Function SetupDiBuildDriverInfoList Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, _
 ByVal DriverType As Long) As Boolean

'Device Installation Function Codes
Public Const DIF_REMOVE = &H5
Public Const DIF_SELECTBESTCOMPATDRV = &H17

Public Declare Function SetupDiCallClassInstaller Lib "setupapi.dll" _
 (ByVal InstallFunction As Long, _
 ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA) As Boolean

'CreationFlags - controls how the device information element is created
Public Const DICD_GENERATE_ID = 1

Public Declare Function SetupDiCreateDeviceInfo _
 Lib "setupapi.dll" Alias "SetupDiCreateDeviceInfoA" _
 (ByVal DeviceInfoSet As Long, _
 ByVal DeviceName As String, ByRef ClassGuid As GUID, _
 ByVal DeviceDescription As String, ByVal hWndParent As Long, _
 ByVal CreationFlags As Long, ByRef DeviceInfoData As SP_DEVINFO_DATA) As Boolean
 
Public Declare Function SetupDiCreateDeviceInfoList Lib "setupapi.dll" _
 (ByRef ClassGuid As GUID, Optional ByVal hWndParent As Long) As Long
 
'Scope - where the information is stored. The key created can be global or hardware profile-specific.
Public Const DICS_FLAG_GLOBAL = &H1
'KeyType -The type of registry storage key to create.
Public Const DIREG_DRV = 2

Public Declare Function SetupDiCreateDevRegKey _
 Lib "setupapi.dll" Alias "SetupDiCreateDevRegKeyA" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Scope As Long, _
 ByVal HwProfile As Long, ByVal KeyType As Long, ByVal InfHandle As Long, _
 ByVal InfSectionName As String) As Long
 
Public Declare Function SetupDiDestroyDeviceInfoList Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long) As Boolean
Public Declare Function SetupDiGetDeviceInstallParams _
 Lib "setupapi.dll" Alias "SetupDiGetDeviceInstallParamsA" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, _
 ByRef DeviceInstallParams As SP_DEVINSTALL_PARAMS) As Boolean
Public Declare Function SetupDiGetINFClass Lib "setupapi.dll" Alias "SetupDiGetINFClassA" _
 (ByVal InfName As String, ByRef ClassGuid As GUID, _
 ByVal ClassName As String, ByVal ClassNameSize As Long, _
 Optional ByRef RequiredSize As Long) As Boolean
Public Declare Function SetupDiGetSelectedDriver _
 Lib "setupapi.dll" Alias "SetupDiGetSelectedDriverA" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByRef DriverInfoData As SP_DRVINFO_DATA) As Boolean
Public Declare Function SetupDiOpenDevRegKey Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Scope As Long, _
 ByVal HwProfile As Long, ByVal KeyType As Long, ByVal samDesired As Long) As Long
Public Declare Function SetupDiRegisterDeviceInfo Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Flags As Long, _
 ByVal CompareProc As Long, ByVal CompareContext As Long, ByRef DupDeviceInfoData As Long) As Boolean 'Optional параметры опускаем
Public Declare Function SetupDiSetDeviceInstallParams _
 Lib "setupapi.dll" Alias "SetupDiSetDeviceInstallParamsA" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, _
 ByRef DeviceInstallParams As SP_DEVINSTALL_PARAMS) As Boolean
 
'Property - identifies the property to be set
Public Const SPDRP_HARDWAREID = 1 'REG_MULTI_SZ string that contains the list of hardware IDs for a device
 
Public Declare Function SetupDiSetDeviceRegistryProperty _
 Lib "setupapi.dll" Alias "SetupDiSetDeviceRegistryPropertyA" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA, ByVal Property As Long, _
 ByVal PropertyBuffer As Long, ByVal PropertyBufferSize As Long) As Boolean
Public Declare Function SetupDiSetSelectedDevice Lib "setupapi.dll" _
 (ByVal DeviceInfoSet As Long, _
 ByRef DeviceInfoData As SP_DEVINFO_DATA) As Boolean
 
'InstallFlags -A caller-supplied value
Public Const INSTALLFLAG_FORCE = &H1

Public Declare Function UpdateDriverForPlugAndPlayDevices _
 Lib "newdev.dll" Alias "UpdateDriverForPlugAndPlayDevicesA" _
 (ByVal hWndParent As Long, ByVal HardwareId As String, _
 ByVal FullInfPath As String, ByVal InstallFlags As Long, _
 Optional ByRef bRebootRequired As Boolean) As Boolean

Public Function InstallModem(ByVal INF_File As String, _
 ByVal COM_Port As String, ByVal Hardware_ID As String, _
 Optional ByRef RebootRequired As Boolean) As Boolean
  'INF_File -путь к inf-файлу (напр. C:\111\mdmgen.inf)
  'COM_Port -порт, на кот. устанавливаем (напр. COM35)
  'Hardware_ID -напр. mdmgen144
  'RebootRequired-возвращается true если нужна перезагрузка
  
  Dim bResult As Boolean
  Dim m_ClassGUID As GUID
  Dim m_ClassName As String
  Dim ReqSize As Long
  Dim hDeviceInfoSet As Long
  Dim m_DeviceInfoData As SP_DEVINFO_DATA
  Dim bRemove As Boolean
  Dim hKeyDev As Long
  Dim dwRet As Long
  Dim m_DriverInfoData As SP_DRVINFO_DATA
  Dim m_DeviceInstallParams As SP_DEVINSTALL_PARAMS
  
  ' Use the INF File to extract the Class GUID
  bResult = SetupDiGetINFClass(INF_File, m_ClassGUID, m_ClassName, 0, ReqSize)
  If (bResult = False) And (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then
    m_ClassName = String(ReqSize, 0)
    bResult = SetupDiGetINFClass(INF_File, m_ClassGUID, m_ClassName, ReqSize)
    If bResult = False Then
      Debug.Print "SetupDiGetINFClass Error " & RaiseAPIErrorByNumber(Err.LastDllError)
      Exit Function
    Else
      m_ClassName = Left(m_ClassName, InStr(m_ClassName, Chr(0)) - 1)
      Debug.Print "m_ClassName=" & m_ClassName
    End If
  Else
    Debug.Print "SetupDiGetINFClass Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    Exit Function
  End If
  
  ' Create the container for the to-be-created Device Information Element
  hDeviceInfoSet = SetupDiCreateDeviceInfoList(m_ClassGUID)
  If hDeviceInfoSet = INVALID_HANDLE_VALUE Then
    Debug.Print "SetupDiCreateDeviceInfoList Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    Exit Function
  End If
  Debug.Print "hDeviceInfoSet=" & hDeviceInfoSet
  
  ' Now create the element. Use the Class GUID and Name from the INF file.
  m_DeviceInfoData.cbSize = LenB(m_DeviceInfoData)
  bResult = SetupDiCreateDeviceInfo(hDeviceInfoSet, m_ClassName, m_ClassGUID, _
   vbNullString, 0&, DICD_GENERATE_ID, m_DeviceInfoData)
  If bResult = False Then
    Debug.Print "SetupDiCreateDeviceInfo Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo Cleanup
  End If
  
  ' Add the HardwareID to the Device's HardwareID property.
  bResult = SetupDiSetDeviceRegistryProperty(hDeviceInfoSet, m_DeviceInfoData, SPDRP_HARDWAREID, _
   StrPtr(StrConv(Hardware_ID, vbFromUnicode)), Len(Hardware_ID) + 2)
  If bResult = False Then
    Debug.Print "SetupDiSetDeviceRegistryProperty Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo Cleanup
  End If
  
  bResult = SetupDiRegisterDeviceInfo(hDeviceInfoSet, m_DeviceInfoData, 0&, 0&, 0&, 0&)
  If bResult = False Then
    Debug.Print "SetupDiRegisterDeviceInfo 1 Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    bRemove = True
    GoTo Cleanup
  End If
  
  hKeyDev = SetupDiOpenDevRegKey(hDeviceInfoSet, m_DeviceInfoData, _
   DICS_FLAG_GLOBAL, 0&, DIREG_DRV, KEY_ALL_ACCESS)
  If (hKeyDev = INVALID_HANDLE_VALUE) Then 'This call fails....
    hKeyDev = SetupDiCreateDevRegKey(hDeviceInfoSet, m_DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, 0, vbNullString)
    If hKeyDev = INVALID_HANDLE_VALUE Then
      Debug.Print "SetupDiCreateDeviceInfoList Error " & RaiseAPIErrorByNumber(Err.LastDllError)
      bRemove = True
      GoTo Cleanup
    End If
  End If
  Debug.Print "hKeyDev=" & hKeyDev
  
  dwRet = RegSetValueEx(hKeyDev, "AttachedTo", 0&, REG_SZ, COM_Port, CLng(Len(COM_Port) + 1))
  RegCloseKey hKeyDev
  If dwRet <> ERROR_SUCCESS Then
    Debug.Print "RegSetValueEx Error " & RaiseAPIErrorByNumber(dwRet)
    bRemove = True
    GoTo Cleanup
  End If
  
  bResult = SetupDiRegisterDeviceInfo(hDeviceInfoSet, m_DeviceInfoData, 0&, 0&, 0&, 0&)
  If bResult = False Then
    Debug.Print "SetupDiRegisterDeviceInfo 2 Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    bRemove = True
    GoTo Cleanup
  End If
  
  ' Install the Driver
  ' http://support.microsoft.com/kb/889763/ru
  ' первая попытка (InstallSelectedDriver) - устанавливаем драйвер только для данного девайса
  ' в m_DeviceInstallParams указываем устанавливать драйвер строго из заданного INF
  
  ' InstallSelectedDriver works on the selected device and on the
  ' selected driver on that device. Therefore, set this device as the
  ' selected one in the device information list.
  bResult = SetupDiSetSelectedDevice(hDeviceInfoSet, m_DeviceInfoData)
  If bResult = False Then
    Debug.Print "SetupDiSetSelectedDevice Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  '==================================================
  ' You now have a SP_DEVINFO_DATA structure
  ' representing your device.  Next, get a SP_DRVINFO_DATA
  ' structure to install on that device.
  m_DeviceInstallParams.cbSize = LenB(m_DeviceInstallParams)
  bResult = SetupDiGetDeviceInstallParams(hDeviceInfoSet, _
                                       m_DeviceInfoData, _
                                       m_DeviceInstallParams)
  If bResult = False Then
    Debug.Print "SetupDiGetDeviceInstallParams Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If

  ' Only build the driver list out of the passed-in INF.
  ' To do this, set the DI_ENUMSINGLEINF flag, and copy the
  ' full path of the INF into the DriverPath field of the
  ' DeviceInstallParams structure.
  m_DeviceInstallParams.Flags = m_DeviceInstallParams.Flags Or DI_ENUMSINGLEINF
  Dim i As Long
  For i = 0 To Len(INF_File) - 1
    m_DeviceInstallParams.DriverPath(i) = Asc(Mid(INF_File, i + 1, 1))
  Next i
  
  ' Set the DI_FLAGSEX_ALLOWEXCLUDEDDRVS flag so that you can use
  ' this INF even if it is marked as ExcludeFromSelect.
  ' ExcludeFromSelect means do not show the INF in the legacy Add
  ' Hardware Wizard.
  m_DeviceInstallParams.FlagsEx = m_DeviceInstallParams.FlagsEx Or DI_FLAGSEX_ALLOWEXCLUDEDDRVS
  bResult = SetupDiSetDeviceInstallParams(hDeviceInfoSet, _
                                       m_DeviceInfoData, _
                                       m_DeviceInstallParams)
  If bResult = False Then
    Debug.Print "SetupDiSetDeviceInstallParams Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  '==================================================
  
  ' Build up a Driver Information List.
  ' Build a compatible driver list, meaning only include the
  ' driver nodes that match one of the hardware or compatible Ids of
  ' the device.
  bResult = SetupDiBuildDriverInfoList(hDeviceInfoSet, m_DeviceInfoData, SPDIT_COMPATDRIVER)
  If bResult = False Then
    Debug.Print "SetupDiBuildDriverInfoList Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  ' Pick the best driver in the list of drivers that was built.
  bResult = SetupDiCallClassInstaller(DIF_SELECTBESTCOMPATDRV, hDeviceInfoSet, m_DeviceInfoData)
  If bResult = False Then
    Debug.Print "SetupDiCallClassInstaller Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  ' Get the selected driver node.
  ' Note: If this list does not contain any drivers, this call
  ' will fail with ERROR_NO_DRIVER_SELECTED.
  m_DriverInfoData.cbSize = LenB(m_DriverInfoData)
  bResult = SetupDiGetSelectedDriver(hDeviceInfoSet, m_DeviceInfoData, m_DriverInfoData)
  If bResult = False Then
    Debug.Print "SetupDiGetSelectedDriver Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  End If
  
  Dim dwRebootRequired As Long
  bResult = InstallSelectedDriver(0, hDeviceInfoSet, 0&, 0&, dwRebootRequired)
  If bResult = False Then
    Debug.Print "InstallSelectedDriver Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    GoTo ForceInstall
  Else
    If (dwRebootRequired = DI_NEEDREBOOT) Or (dwRebootRequired = DI_NEEDRESTART) Then _
     RebootRequired = True
    InstallModem = True
    Debug.Print "InstallSelectedDriver OK."
    GoTo Cleanup
  End If
    
ForceInstall:
  'по сути этот код не нужен
  'используем UpdateDriverForPlugAndPlayDevices (также с явным указанием INF-файла)
  'избегаем использовать этот метод, т.к. он обновляет драйвера для всех
  'ранее установленных девайсов с таким же Hardware_ID, в чем нет необходимости
  'чисто для подстраховки, раз уж сделано
  bResult = UpdateDriverForPlugAndPlayDevices(0&, Hardware_ID, INF_File, _
   INSTALLFLAG_FORCE, RebootRequired)
  If bResult = False Then
    Debug.Print "UpdateDriverForPlugAndPlayDevices Error " & RaiseAPIErrorByNumber(Err.LastDllError)
    bRemove = True
    GoTo Cleanup
  Else
    InstallModem = True
    Debug.Print "UpdateDriverForPlugAndPlayDevices OK."
    GoTo Cleanup
  End If
    
Cleanup:
  If bRemove Then
    ' Delete Device Instance that was registered using SetupDiRegisterDeviceInfo
    ' May through an error if Device not registered -- who cares??
    SetupDiCallClassInstaller DIF_REMOVE, hDeviceInfoSet, m_DeviceInfoData
  End If
  
  SetupDiDestroyDeviceInfoList hDeviceInfoSet
  
End Function
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Возможно ли программно установить модем?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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