使用できるCOMポートを検索          <TOP>


使用できるCOMポート(COM1〜COM16)を調べます。

CreateFile ファイルの作成・オープン

CloseHandle オープンしているカーネルオブジェクトのハンドルをクローズ

 

 

'================================================================
'= COMポートの存在を調べる
'=    (ComPort.bas)
'================================================================
#include "Windows.bi"

Type SECURITY_ATTRIBUTES
    nLength              As Long
    lpSecurityDescriptor As Long
    bInheritHandle       As Long
End Type

' ファイルの作成・オープン
Declare Function Api_CreateFile& Lib "kernel32" Alias "CreateFileA" (ByVal lFileName$, ByVal dDesiredAccess&, ByVal dShareMode&, lSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dCreationDisposition&, ByVal dFlagsAndAttributes&, ByVal hTemplateFile&)

' オープンしているカーネルオブジェクトのハンドルをクローズ
Declare Function Api_CloseHandle& Lib "kernel32" Alias "CloseHandle" (ByVal hObject&)

#define FILE_SHARE_READ &H1            '他のアプリケーションからの読み込み可能
#define FILE_SHARE_WRITE &H2           '他のアプリケーションから書き込み可能
#define OPEN_EXISTING 3                'ファイルをオープンする
#define FILE_ATTRIBUTE_NORMAL &H80     '他のファイル属性を持たない

Var Shared List1 As Object
Var Shared Button1 As Object

List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function ComAvailable(ComNum As Integer) As Integer
Function ComAvailable(ComNum As Integer) As Integer
    Var hCom As Long
    Var sa As SECURITY_ATTRIBUTES
    Var Ret As Long

    'ComPortを開く
    hCom = Api_CreateFile("COM" & Trim$(Str$(ComNum)) & "", 0, FILE_SHARE_READ Or FILE_SHARE_WRITE, sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

    If hCom = True Then
        ComAvailable = False               'COMの存在なし
    Else
        ComAvailable = True                'COMの存在あり
        Ret = Api_CloseHandle(hCom)        'ComPortクローズ
    End If
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var i As Integer

    For i = 1 To 16
        If ComAvailable(i) Then
            List1.AddString "COM" & Trim$(Str$(i)) & " OK"
        Else
            List1.AddString "COM" & Trim$(Str$(i)) & " NG"
        End If
    Next
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End