ポート名の列挙(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