首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VB.NET 專案中使用 MSComm 控制項錯誤:需註冊 ActiveX 與改用 SerialPort 替代方案

     編輯:程式設計疑難解答

錯誤訊息分析

System.InvalidOperationException: 創建窗體時出錯。
InnerException: 沒有註冊類 (HRESULT: 0x80040154 REGDB_E_CLASSNOTREG)

原因:MSComm 是 VB6 時代的 ActiveX 控制項(MSCOMM32.OCX),在 .NET 環境下需先以系統管理員身分執行 regsvr32 MSCOMM32.OCX 註冊至系統登錄,且目標機器必須安裝該 OCX。

解決方案

方案一:註冊 MSComm(不推薦新專案)

  1. 取得 MSCOMM32.OCX(VB6 安裝目錄或網路下載)。
  2. 以管理員身分開啟 CMD,執行:
    regsvr32 "C:\Path\To\MSCOMM32.OCX"
    
  3. 專案加入參考:右鍵專案 → Add Reference → COM → 勾選 Microsoft Comm Control 6.0。
  4. 工具箱右鍵 → Choose Items → COM Components → 勾選 MSComm。

缺點:部署麻煩(需目標機註冊)、32/64 位元相容性問題、微軟已停止支援。

方案二:使用 .NET 內建 System.IO.Ports.SerialPort(強烈推薦)

Imports System.IO.Ports

Public Class Form1
    Private WithEvents sp As New SerialPort()

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        sp.PortName = "COM3"
        sp.BaudRate = 9600
        sp.Parity = Parity.None
        sp.DataBits = 8
        sp.StopBits = StopBits.One
        sp.Encoding = Encoding.ASCII ' 或 UTF8
        sp.ReadTimeout = 1000
        sp.WriteTimeout = 1000
    End Sub

    Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click
        Try
            If Not sp.IsOpen Then sp.Open()
            MessageBox.Show("串口已開啟")
        Catch ex As Exception
            MessageBox.Show("開啟失敗: " & ex.Message)
        End Try
    End Sub

    Private Sub sp_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles sp.DataReceived
        ' 注意:此事件在背景執行緒觸發,更新 UI 需 Invoke
        Dim data As String = sp.ReadExisting()
        Me.Invoke(Sub() txtReceive.AppendText(data))
    End Sub

    Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
        If sp.IsOpen Then sp.Write(txtSend.Text)
    End Sub
End Class

SerialPort 關鍵優勢

  • 純 .NET 管理代碼,無需註冊 ActiveX,部署零依賴。
  • 支援非同步事件 DataReceived、ErrorReceived、PinChanged。
  • 跨平台(.NET Core / .NET 5+ 在 Linux/Windows 均可用)。
  • 完整掌控編碼、逾時、緩衝區大小等參數。

遷移建議

現有 VB6/MSComm 專案遷移至 VB.NET 時,直接重寫通訊層使用 SerialPort,不要嘗試移植 MSComm,長遠維護成本更低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved