我可以通过编程方式从WPF应用程序确定哪些虚拟COM端口是传入的,哪些是传出的?

时间:2015-09-11 16:11:11

标签: c# wpf bluetooth serial-port virtual-serial-port

我需要连接的蓝牙串行设备。我可以通过

查询WMI数据库以找到我需要的蓝牙端口
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\Device\BthModem0

或通过检查

使用注册表

{{1}}

但是我无法找到一个公开的API,它允许我确定两个创建的虚拟COM端口中的哪一个是传入和传出的。

如果您在设备管理器中挖掘得足够深,那么这些信息会显示在Windows上,因此我应该可以使用(通过PInvoke或其他东西?)但是我需要找到一种从WPF应用程序以编程方式找到它的方法。 / p>

1 个答案:

答案 0 :(得分:0)

您正在寻找的是获得设备功能。

注意区别:传入端口是 Incoming vs Outgoing Port Capabilities

我已经创建了一个示例C ++示例,它根据以下example执行您所需的操作。您需要使用PINVOKE来调用适当的方法。对不起,我不能提供C#代码作为我的工作。

这取决于Microsoft蓝牙堆栈。您需要对widcomm或Toshiba蓝牙堆栈进行一些修改。

您可以从Github

中提取样本

要使其工作,您需要将以下内容添加到链接器选项

Setupapi.lib Ole32.lib

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#include "Objbase.h"

int main(int argc, char *argv[], char *envp[])
{
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;
    CLSID guid;
    //Class = Ports
    //ClassGuid = { 4d36e978 - e325 - 11ce - bfc1 - 08002be10318}


    LPCOLESTR  guidString = L"{86E0D1E0-8089-11D0-9CE4-08003E301F73}";
    HRESULT a = CLSIDFromString(guidString, &guid);
    // Create a HDEVINFO with all present devices.
    hDevInfo = SetupDiGetClassDevs(&guid,
        0, // Enumerator
        0,
        DIGCF_DEVICEINTERFACE);

    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        // Insert error handling here.
        return 1;
    }

    // Enumerate through all devices in Set.

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (i = 0;SetupDiEnumDeviceInfo(hDevInfo, i,
        &DeviceInfoData);i++)
    {
        DWORD DataT;
        LPTSTR buffer = (LPTSTR)LocalAlloc(LPTR, 4096 * 2);
        DWORD buffersize = 4096;

        LPBYTE buffer2 = (LPBYTE)LocalAlloc(LPTR, 4096 * 2);



        SetupDiGetDeviceRegistryProperty(
            hDevInfo,
            &DeviceInfoData,
            SPDRP_FRIENDLYNAME,
            &DataT,
            (PBYTE)buffer,
            buffersize,
            &buffersize);





        if (wcsstr(buffer, L"Standard Serial over Bluetooth link"))
        {
            SetupDiGetDeviceRegistryProperty(
                hDevInfo,
                &DeviceInfoData,
                SPDRP_CAPABILITIES,
                &DataT,
                (PBYTE)buffer2,
                buffersize,
                &buffersize);

            wprintf(L"Result:%s - ", buffer);
            int a = *buffer2;
            if (a == 0xC0)
            {
                wprintf(L"Incoming");
            }
            else if (a == 0xC4)
            {
                wprintf(L"Outgoing");
            }

            wprintf(L"\n", buffer);

        }

        if (buffer) LocalFree(buffer);
    }


    if (GetLastError() != NO_ERROR &&
        GetLastError() != ERROR_NO_MORE_ITEMS)
    {
        // Insert error handling here.
        return 1;
    }

    //  Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);
    getchar();
    return 0;
}

Result