void GetBluetooth()
{

    CString strVal(L"");
    CString strName(L"");
    // 初始化winsock  
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
    {
        strVal.Format(L"WSAStartup failed with error code: %d", WSAGetLastError());
        SetTips(strVal);
        return;
    }
    //初始化蓝牙枚举结构
    DWORD dwWsaqsLen = sizeof(WSAQUERYSET);
    LPWSAQUERYSET lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
    lpWsaqs->dwSize = sizeof(WSAQUERYSET);
    lpWsaqs->dwNameSpace = NS_BTH;

    //开始枚举蓝牙设备
    DWORD dwWsaqsFlags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
    HANDLE hService;
    if (WSALookupServiceBegin(lpWsaqs, dwWsaqsFlags, &hService) != SOCKET_ERROR)
    {
        BOOL bFinished = FALSE;
        m_vBluetoothInfo.clear();
        while (!bFinished)
        {
            BLUETOOTH_INFO btInfo;
            if (WSALookupServiceNext(hService, dwWsaqsFlags, &dwWsaqsLen, lpWsaqs) == NO_ERROR)
            {
                SOCKADDR_BTH *saBth = (SOCKADDR_BTH*)lpWsaqs->lpcsaBuffer->RemoteAddr.lpSockaddr;
        
                strName = lpWsaqs->lpszServiceInstanceName;
                btInfo.btAddr = saBth->btAddr;
                btInfo.strName = lpWsaqs->lpszServiceInstanceName;
                m_vBluetoothInfo.push_back(btInfo);
                SetTips(L"发现蓝牙设备");
                strVal.Format(L"NAP:0x%04X SAP:0x%08X 设备名称:%s", GET_NAP(btInfo.btAddr), GET_SAP(btInfo.btAddr), lpWsaqs->lpszServiceInstanceName);
                SetTips(strVal);
                SetTips(L"------------\n");
            }
            else
            {
                // 错误处理
                switch (WSAGetLastError())
                {
                    // 所给缓冲区过小,重新申请
                case WSAEFAULT:
                    HeapFree(GetProcessHeap(), 0, lpWsaqs);
                    lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
                    break;

                    // 没有更多蓝牙设备了
                case WSA_E_NO_MORE:
                    bFinished = true;
                    break;

                default:
                    //bFinished = true;
                    break;
                }
            }
        }
        WSALookupServiceEnd(hService);
    }
    
    // 释放资源
    HeapFree(GetProcessHeap(), 0, lpWsaqs);
    WSACleanup();
}

更多推荐