Declare Function EnumPorts Lib "winspool.drv" Alias _ "EnumPortsA" (ByVal pName As String, _ ByVal Level As Long, ByVal lpbPorts As Long, _ ByVal cbBuf As Long, pcbNeeded As Long, _ pcReturned As Long) As Long
EnumPorts перечисляет порты, доступные для печати.
Private Type PORT_INFO_2 pPortName As String pMonitorName As String pDescription As String fPortType As Long Reserved As Long End Type Private Type API_PORT_INFO_2 pPortName As Long pMonitorName As Long pDescription As Long fPortType As Long Reserved As Long End Type Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long Private Declare Function GetProcessHeap Lib "kernel32" () As Long Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long Dim Ports(0 To 100) As PORT_INFO_2 Public Function TrimStr(strName As String) As String 'Finds a null then trims the string Dim x As Integer x = InStr(strName, vbNullChar) If x > 0 Then TrimStr = Left(strName, x - 1) Else TrimStr = strName End Function Public Function LPSTRtoSTRING(ByVal lngPointer As Long) As String Dim lngLength As Long ' Получим число символов в строке lngLength = lstrlenW(lngPointer) * 2 ' Инициализируем строку LPSTRtoSTRING = String(lngLength, 0) 'Копируем строку CopyMemory ByVal StrPtr(LPSTRtoSTRING), ByVal lngPointer, lngLength ' Конвертируем в Unicode LPSTRtoSTRING = TrimStr(StrConv(LPSTRtoSTRING, vbUnicode)) End Function ' Используем ServerName для задания имени удаленного компьютера ("//WIN95WKST") ' или оставляем пустой ("") для получения портов локальной машины Public Function GetAvailablePorts(ServerName As String) As Long Dim ret As Long Dim PortsStruct(0 To 100) As API_PORT_INFO_2 Dim pcbNeeded As Long Dim pcReturned As Long Dim TempBuff As Long Dim i As Integer ' Получим число байта, необходимых для содержания данных ret = EnumPorts(ServerName, 2, TempBuff, 0, pcbNeeded, pcReturned) ' Выделяем буфер TempBuff = HeapAlloc(GetProcessHeap(), 0, pcbNeeded) ret = EnumPorts(ServerName, 2, TempBuff, pcbNeeded, pcbNeeded, pcReturned) If ret Then ' Конвертируем полученную строку CopyMemory PortsStruct(0), ByVal TempBuff, pcbNeeded For i = 0 To pcReturned - 1 Ports(i).pDescription = LPSTRtoSTRING(PortsStruct(i).pDescription) Ports(i).pPortName = LPSTRtoSTRING(PortsStruct(i).pPortName) Ports(i).pMonitorName = LPSTRtoSTRING(PortsStruct(i).pMonitorName) Ports(i).fPortType = PortsStruct(i).fPortType Next End If GetAvailablePorts = pcReturned 'Free the Heap Space allocated for the Buffer If TempBuff Then HeapFree GetProcessHeap(), 0, TempBuff End Function Private Sub Form_Load() Dim NumPorts As Long Dim i As Integer 'Get the Numbers of Ports in the System 'and Fill the Ports Structure NumPorts = GetAvailablePorts(vbNullString) Me.AutoRedraw = True For i = 0 To NumPorts - 1 Me.Print Ports(i).pPortName Next End Sub