Я использую следующую функцию в переопределении WndProc:
Public Function GetPortName() As String
Dim portNameData As String
Dim comPortNumber As String
Try
Dim portSearcher As New ManagementObjectSearcher("\root\CIMV2", "Select Name, PNPDeviceID from Win32_PnPEntity")
For Each port As System.Management.ManagementObject In portSearcher.Get()
If port("Name").ToString.ToUpper.Contains("(COM") Then
portNameData = port("Name").ToString
comPortNumber = port("Name").ToString.Substring(port("Name").ToString.IndexOf("(COM") + 4)
comPortNumber = comPortNumber.TrimEnd(")"c)
If port("PNPDeviceID").ToString.ToUpper.StartsWith("USB\VID_1234&PID_1234") Then
Return "COM" & comPortNumber
End If
End If
Next
Catch ex As Exception
End Try
Return ""
End Function
Функция работает нормально, но теперь я использую ее в новом приложении из формы. На каждой итерации цикла For (в строке For Each port As System...
) я получаю это сообщение:
Обнаружен DisconnectedContext
Контекст 0x607fd8 отключен. Прокси-сервер не будет использоваться для обслуживания запроса в компоненте COM. Это может привести к повреждению или потере данных. Чтобы избежать этой проблемы, убедитесь, что все контексты / апартаменты остаются живыми до тех пор, пока приложение не будет полностью завершено с RuntimeCallableWrappers, которые представляют COM-компоненты, которые живут внутри них.
Я думаю, что это какая-то проблема с многопоточностью. Как я могу вызвать эту функцию из формы таким образом, чтобы эта ошибка не возникала?
Я нашел пост на MSDN, в котором описана очень похожая проблема . Парень говорит:
Извините, не тратьте свое время. Код работает нормально, когда он запускается в простом консольном приложении. Проблема возникла, когда он вызывался в форме Windows, отвечающей на DriveDetectorEvent.
Я бы хотел выяснить, что отличается в приложении Forms.
Редактирование и возможное решение: На основе ответа в DisconnectedContext MDA при вызове функций WMI в однопоточном приложении Я думаю, что решение здесь состоит в том, чтобы вызвать GetPortName()
вне WndProc , Я проверю это сегодня вечером и опубликую свой результат.