ポート名の列挙(T) <TOP>
ポート名を列挙します。
EnumPorts ポート名を列挙する関数
RtlMoveMemory 別の位置にメモリブロックを移動する関数
左:PC-VL100/2(WindowsXP) 右:FLORA(Windows2K)

例2.FLORA(Windows98)

'================================================================ '= ポート名取得
'= (PortName.bas)
'================================================================ #include"Windows.bi" ' ポート情報を受け取る構造体 Type PORT_INFO_1 PNAME As Long End Type ' ポート名を列挙する関数の宣言 Declare Function Api_EnumPorts& Lib "winspool.drv" Alias "EnumPortsA" (ByVal pName$, ByVal Level&, lpPorts As Any, ByVal cbBuf&, pcbNeeded&, pcReturned&) ' ある位置から別の位置にメモリブロックを移動 Declare Function MoveMemory& Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal length&) Var Shared List1 As Object
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
Var Level As Long
Var Needed As Long
Var Returned As Long
Var PortName As String * 64
Var ct As Long
Var Ret As Long
' 構造体のレベルを指定
Level = 1
' バッファに必要なサイズを取得
Ret = Api_EnumPorts(Chr$(0), Level, ByVal 0, 0, Needed, Returned)
' バッファを確保
Var Buffer(Needed - 1) As byte
' ポート情報を取得
Ret = Api_EnumPorts(Chr$(0), Level, Buffer(0), Needed, Needed, Returned)
' 取得したポート情報の構造体を確保
Var pi1(Returned - 1) As PORT_INFO_1
For ct = 0 To Returned - 1
'データ列から構造体1つ分を抜き取る
Ret = MoveMemory(pi1(ct), Buffer(ct * Len(pi1(ct))), Len(pi1(ct)))
'ポインタから最大字数でポート名を得る
PortName = String$(64, Chr$(0))
Ret = MoveMemory(PortName, ByVal pi1(ct).PNAME, Len(PortName))
'ポート名末尾の不要部分を捨てる
PortName = KLeft$(PortName, KInStr(PortName, Chr$(0)) - 1)
List1.AddString PortName
Next CT
End Sub
'================================================================
'=
'================================================================
While 1
WaitEvent
Wend
Stop
End