• 0

Bluetooth Programming [C]


Question

#include <stdlib.h>
#include <stdio.h>
#include <Winsock2.h>
#include <Ws2bth.h>
#include <BluetoothAPIs.h>
#include <windows.h>

void ErrorExit(LPTSTR lpszFunction);

int main(void)
{
	BLUETOOTH_FIND_RADIO_PARAMS FirstRadio;
	HANDLE RadioHandle;
	HANDLE NextRadio;
	BOOL FoundNextRadioHandle;
	BLUETOOTH_RADIO_INFO RadioDeviceInfo;
	DWORD dw;

	BluetoothFindFirstRadio((BLUETOOTH_FIND_RADIO_PARAMS*)&FirstRadio,(HANDLE*)&RadioHandle);
	if(RadioHandle == NULL)
	{
  printf("Problems Creating Radio Handle");
	}

	FoundNextRadioHandle = BluetoothFindNextRadio((HANDLE*)&RadioHandle,(HANDLE*)&NextRadio);

	if(FoundNextRadioHandle == TRUE)
	{
  printf("Found Another Bluetooth Radio");
	}
	else
	{
  printf("Only One Bluetooth Radio Handle Present\n");
  
	}
  
	BluetoothGetRadioInfo(RadioHandle,(BLUETOOTH_RADIO_INFO*)&RadioDeviceInfo);
	dw = GetLastError();
	ErrorExit((LPTSTR)&dw);

	HBLUETOOTH_DEVICE_FIND DeviceHandle;
	BLUETOOTH_DEVICE_INFO DeviceInfo;
	BLUETOOTH_DEVICE_SEARCH_PARAMS SearchParams;

	BOOL FoundDevice; /*Return Value of FindNextDevice*/
	BLUETOOTH_DEVICE_INFO FoundDeviceInfo; /*Structure Containing Info of next Device*/

	SearchParams.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
	SearchParams.fReturnAuthenticated = TRUE;
	SearchParams.fReturnRemembered = TRUE;
	SearchParams.fReturnUnknown = TRUE;
	SearchParams.fReturnConnected = TRUE;
	SearchParams.fIssueInquiry = TRUE;
	SearchParams.cTimeoutMultiplier = 10;
	SearchParams.hRadio = RadioHandle;

	BluetoothFindFirstDevice((BLUETOOTH_DEVICE_SEARCH_PARAMS*)&SearchParams,(BLUETOOTH_DEVICE_INFO*)&DeviceInfo);
	dw = GetLastError();
	ErrorExit((LPTSTR)&dw);

	FoundDevice = BluetoothFindNextDevice((HBLUETOOTH_DEVICE_FIND*)&DeviceHandle,(BLUETOOTH_DEVICE_INFO*) &FoundDeviceInfo);
	dw = GetLastError();
	ErrorExit((LPTSTR)&dw);

	return 0;
}

void ErrorExit(LPTSTR lpszFunction) 
{ 
    TCHAR szBuf[80]; 
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError(); 

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    wsprintf(szBuf, 
        "%s failed with error %d: %s", 
        lpszFunction, dw, lpMsgBuf); 

    MessageBox(NULL, szBuf, "Error", MB_OK); 

    LocalFree(lpMsgBuf);
    ExitProcess(dw); 
}

Hi, Please could someone tell me why this program isnt working. It keeps comming up with the error :

  Quote
Error 126 : The specified module could not be found.

It needs the platform SDK installed for the bluetooth headers and such. It also doesnt find the local bluetooth dongle or my phone which is what it is intended to do.

Thanks in Advance.

Sawyer12 :)

Link to comment
https://www.neowin.net/forum/topic/275426-bluetooth-programming-c/
Share on other sites

13 answers to this question

Recommended Posts

  • 0

If a function succeeds, it is not required to set the last error to 0. You have to check what success means for each function. For example, BluetoothFindFirstDevice is supposed to return a valid handle and fails on NULL - you should check this first. If you have a NULL handle, then call GetLastError.

  • 0
  Sawyer12 said:
Can anyone tell me the difference between the functions :

BluetoothFindFirstDevice and  BluetoothFindFirstRadio ?

Which should I call first, Im basically trying to get my program to find my bluetooth phone. Any ideas?

585348297[/snapback]

I tried the code on 2 dev machines:

Machine 1: Mitsumi Bluetooth Adapter - Got an Error 126

Machine 2: Microsoft Bluetooth Keyboard/Mouse Adapter - Worked no problem

I guess it could be a driver issue.

BluetoothFindfirstDevice, this would find a device like phone, pda, keyboard etc.

BluetoothFindFirstRadio, this would find the actual bluetooth adapter.

  • 0

If you only have the 1 bluetooth adapter installed then you can have the line

 SearchParams.hRadio = NULL;

Then you can delete all the code that deals with BluetoothFindFirstRadio().

But like I said, 1 adapter worked for me, the other didn't... If you are still getting the same error it might be the adapter/api conflict.

  • 0

Here is the code that worked for me

#include "bthdef.h"
#include "BluetoothAPIs.h"
#pragma comment(lib, "irprops.lib")

	BLUETOOTH_DEVICE_SEARCH_PARAMS bdsp;
	BLUETOOTH_DEVICE_INFO bdi;
	HBLUETOOTH_DEVICE_FIND hbf;

	ZeroMemory(&bdsp, sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS));

	bdsp.dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
	bdsp.fReturnAuthenticated = TRUE;
	bdsp.fReturnRemembered = TRUE;
	bdsp.fReturnUnknown = TRUE;
	bdsp.fReturnConnected = TRUE;
	bdsp.fIssueInquiry = TRUE;
	bdsp.cTimeoutMultiplier = 10;
	bdsp.hRadio = NULL;

	bdi.dwSize = sizeof(bdi);

	hbf = BluetoothFindFirstDevice(&bdsp, &bdi);
	DWORD dwErr = GetLastError();

	if (hbf != NULL)
	{
  TCHAR szDevName[MAX_PATH];

  while(1)
  {
  	memset(szDevName, 0x00, sizeof(szDevName));
  	sprintf(szDevName, _T("Name:%S"), bdi.szName);
  	MessageBox(szDevName, _T("Bluetooth Info"));

  	if (BluetoothFindNextDevice(hbf, &bdi) == FALSE)
    break;
  }

  BluetoothFindDeviceClose(hbf);
	}
	else
	{
  //No Devices Found...
	}

  • 0

I think that the Microsoft Bluetoothxxx() API functions are only to enumerate, bond, select & get info of bluetooth devices in the area. You may have to use the Winsock functions to actually communicate to the bluetooth device.

I only do WindowsCE programming, and the MS Bluetooth API functions are very different, eg. once you have bonded/selected a device it usually appears as a COM Port, then it is a simple matter of opening/closing/read/write to that port. On WIn32, I don't know.

Some devices like PDA's use OBEX to transfer files, maybe that could be used, maybe not !!!

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Hello, My thoughts on this are mixed. Microsoft has hosted malicious code in the Microsoft Update Catalog where third party device drivers are stored; I wrote about one such incident about fifteen years ago, so if there are any other old malicious drivers floating around in the catalog, this will be a good step towards preventing any infestations from reoccurring. Another thing, which surprisingly is not mentioned in Microsoft's announcement, is that this helps protect against BYOVD (Bring Your Own Vulnerable Driver) attacks, where malware either comes with or downloads an older device drivers with vulnerabilities in it that can be exploited to gain access to kernel memory. Removing all those old device drivers from the Windows Update Catalog, potentially with all sorts of undisclosed vulnerabilities in them, means an attacker can no longer leisurely count on being able to download them from Microsoft's servers--something that may go unnoticed or ignored by security analysts. This makes the adversary attack a little more noisy, since they have to either include the device driver with the rest of their initial payload or download it from a third-party site at some point prior to beginning their BYOVD attack. On the other hand, it means that people who are looking for a specific version of an older device driver for whatever legitimate reasons, like compatibility, performance or stability, may end up going to dodgy third-party sites in search of older drivers, which increases the risk of exposure to everything from nuisance advertisements and unwanted software to actual malicious code. As for me, I have keeping copies of all the device drivers, firmware updates, etc. I have downloaded over the years, some dating back to DOS and Windows 3.x era, not just for hardware I won, but popular things like unified chipset and video card drivers, just in case I ever needed it. It might seem silly to collect such a thing, but the hardware drivers, firmware updates, and documentation are just about 2 TB in size. From my perspective, it is an inexpensive form of insurance, especially given that disk space is always getting cheaper over time. Regards, Aryeh Goretsky
    • @Raze Bold it boy. (I admit, we all did it from time to time..)
    • Fan Control V227 by Razvan Serea Fan Control is a powerful and versatile portable utility that allows you to monitor, control and customize the fans of your GPU and CPU to keep your machine cool and running smoothly. Fan Control supports a wide range of devices and hardware configurations, giving you complete control over your computer's cooling system. Fan Control backend is mainly based on LibreHardwareMonitor, an open source fork of the original OpenHardwareMonitor. This means that hardware compatiblity is entirely open for anyone to contribute, and doesn't rely on a single developer who may stop caring at some point. Combined with the plugin system, Fan Control is unlocked for many generations of hardware to come. Main features Guided setup process on first launch Save, edit and load multiple profiles Change the theme and color of the application. Multiple temperature sources ( CPU, GPU, motherboard, hard drives... ) Multiple fan curve functions, including a custom graph Mix fan curves or sensor togethers (max, min, average) Low resource usage Advanced tuning with steps, start %, stop %, response time and hysteresis FanControl V227 changelog: Allow decimal with hysteresis values Radeon Pro support through ADLX Fix a bug when cancelling the graph editing dialog Update LibreHardwareMonitorLib Download: FanControl V227 | Installer ~15.0 MB (Open Source) View: Fan Control Homepage | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Lol tf you are talking about. People are PAYING by using this app exclusively, just indirectly. Do you have any idea how much facebook charges for api access to WhatsApp which has become more or less a monopoly in e-commerce.
    • My kid tried, so I took her to Microcenter and showed her the differences in price as well as storage and specs. We bought a Windows machine. She loves it, and is off to college this fall with her gaming level windows laptop at the price of a Mac that came with a 512GB SSD, and half the RAM.
  • Recent Achievements

    • Contributor
      GravityDead went up a rank
      Contributor
    • Week One Done
      BlakeBringer earned a badge
      Week One Done
    • Week One Done
      Helen Shafer earned a badge
      Week One Done
    • First Post
      emptyother earned a badge
      First Post
    • Week One Done
      Crunchy6 earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      660
    2. 2
      ATLien_0
      266
    3. 3
      Michael Scrip
      235
    4. 4
      Steven P.
      164
    5. 5
      +FloatingFatMan
      149
  • Tell a friend

    Love Neowin? Tell a friend!