• 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

    • Never had any issues with the MS Store either. But ymmv and N=1 etc.
    • I am sure the 17 people that actually do it will like it.
    • I've noticed stutters and hitching in this. Unreal has yet to convince me. So far, idTech 8 engine used in Doom The Dark Ages is by far the most beautiful and hyper optimized engine I've seen to date. Period. Its instantaneous load times and absolutely zero stutter gameplay is just next level.
    • As Windows 10 support winds down, KDE welcomes "Windows 10 exiles" to Linux by David Uzondu Early last month, we reported on a Linux (KDE)-backed initiative called "End of 10," which aimed to show folks how to save their unsupported Windows 10 PCs by installing Linux. Now, as we speed towards October 14, 2025, end-of-support date for Windows 10, KDE is still urging, or rather, inviting what it calls "Windows 10 exiles" to consider making the switch. KDE's message is pretty blunt: your Windows 10 computer is about to become "junk" and "officially obsolete" once Microsoft pulls the plug on support. The organization paints a grim picture of unpatched bugs leading to increased risks of being hacked, potentially compromising your data and identity. Beyond security, KDE suggests that new versions of applications will cease to run, and Microsoft will effectively block upgrades to newer Windows versions unless you purchase new hardware. KDE calls this "tech extortion" and points to the environmental impact of discarded PCs. The alternative presented is to "upgrade the smart way" by keeping existing hardware and installing Linux, specifically highlighting its Plasma desktop, which it claims can run well even on machines a decade old. To entice users, KDE details why Plasma could be a good fit. The environment aims for a familiar feel, with a launch menu and workspace akin to what Windows users are accustomed to, but also offers extensive customization to mimic Windows, macOS, or create something entirely unique. Being open source and developed by a nonprofit, Plasma is free. KDE also points to powerful features like multiple virtual desktops and the Dolphin file manager's built-in connectivity tools for servers and cloud services. Recognizing that switching operating systems is a significant step, KDE offers advice for the transition. It concedes Linux "does take some getting used to" and encourages new users to lean on the community for help. A key piece of advice is not to expect the exact same Windows programs but to look for Linux applications that perform similar functions, noting that essentials like Firefox and LibreOffice often come pre-installed. For additional software, KDE points to package managers like its Discover application, which acts as an app store. KDE also outlines what it believes users will not miss from Windows, such as viruses, ads injected into the operating system, spyware, forced updates, and mandatory account registrations. Interestingly, this "What will you miss" section, while focusing on shedding unwanted Windows behaviors, didn't mention the real things you'd also miss, like the full Adobe Creative Suite, specific Microsoft Office desktop applications, or popular titles like Call of Duty and Fortnite, which are often unsupported due to anti-cheat systems that don't work on Linux. If this all sounds good to you, the most straightforward way to get started is by downloading a Linux distribution (or "distro") that comes with KDE Plasma as its default desktop environment. A few good options include Kubuntu, Fedora KDE Spin, openSUSE, and KDE Neon. But as KDE notes, Plasma isn't your only option. Other desktop environments exist, like GNOME, Xfce, and Cinnamon.
    • Looks exactly as i expected minus horrific "pop in" you get from UE. The framerate of video was horrid or the game was full of blur hope that sorted or can be taken off on PC. The Vibrance also seems to be upped very high.
  • Recent Achievements

    • Week One Done
      Jim Dugan earned a badge
      Week One Done
    • Week One Done
      Adam Todd earned a badge
      Week One Done
    • Contributor
      Ed B went up a rank
      Contributor
    • One Month Later
      moporcho earned a badge
      One Month Later
    • One Month Later
      Parotel earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      212
    2. 2
      snowy owl
      156
    3. 3
      ATLien_0
      134
    4. 4
      Xenon
      119
    5. 5
      +FloatingFatMan
      113
  • Tell a friend

    Love Neowin? Tell a friend!