• 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

    • I use both Chrome and Brave simultaneously. Chrome for general browsing, while I keep Brave windows open on other monitors for X, Bluesky, YouTube, and a live news channel like CNN etc..
    • Firefox, for privacy, wide range of plugins without having to suffer the latest Google manifest restrictions and when used on Android for the mobile browser plugins like an ad-blocker, sadly that option isn't available to me now I've swapped to iOS as outside of the EU Firefox mobile is just a reskin of Safari
    • Ok will give that a shot soon as wake up in morning.     Hopefully does restore it working right  
    • Try doing a reset/repair on the Windows store: To reset the Microsoft Store on Windows 11, press the Windows key + I to open Settings, go to Apps & features, find Microsoft Store, click on it, select Advanced options, and then click the Reset button. This will clear the cache and restore the app to its default state, which can help resolve issues.
    • Microsoft's new Exchange Message Trace: What admins need to know before September by Paul Hill Microsoft has just announced the general availability of the new Message Trace in the Exchange admin center (EAC) in Exchange Online for its worldwide (WW) customers. The Redmond giant said that it’ll begin rolling it out in mid-June and complete the rollout in July. Message Trace in the Exchange Admin Center for Exchange Online is a tool that lets admins trace which path emails took as they traveled through the Microsoft 365 organization. It lets admins see if emails were received, rejected, or deferred. It is helpful for troubleshooting mail flow issues and validating policy changes. To get started with the new Message Trace, admins can access it by going to the Exchange admin center > Mail flow > Message Trace. While the Windows-maker has received positive feedback during the Public Preview, you can still provide your thoughts through Exchange admin center > Give Feedback. In addition, Microsoft will continue to maintain the old Message Trace user experience in Exchange admin center and cmdlets for several months to ease the transition, however, they will be deprecated for WW customers starting from September 1. The Reporting Webservice support for Message Trace data will also begin deprecating on this date. A side note to mention here is that this timeline only applies to the WW environment and doesn’t affect GCC, GCC-High, DOD, or other sovereign clouds. More information about the switch over for those will be provided in the second half of the year. Who it affects, and how These changes need to be noted by Exchange Online administrators and IT professionals as those are the people who will be directly affected. Specifically, it will affect anyone managing mail flow and troubleshooting email delivery in Exchange Online. Those who are affected will have to get switched over to the new Message Trace before Microsoft starts deprecating features in several months time. Admins will want to act promptly to avoid any unforeseen issues that could arise. Another detail that admins should be aware of is that scripts that rely on the older “Get-MessageTrace” or “Get-MessageTraceDetail” cmdlets will break on September 1. To address this, admins will need to update their scripts to use the new “Get-MessageTraceV2” and the “Get-MessageTraceDetailV2” cmdlets. Finally, any admins out there using the Reporting Webservice for Message Trace data will also need to make a change. They will need to shift to the new Message Trace PowerShell cmdlets. Why it’s happening Microsoft has been working on a new Message Trace experience, incorporating feedback from the Public Preview phase, to improve its design and performance. The switch gives Microsoft the opportunity to standardize and modernize admin interfaces and the underlying technologies. What to watch for While September 1 may seem like a long way away, fixing any issues, such as scripts due to deprecations, could take some time. Any admins managing the affected items need to ensure they deal with affected components in a timely manner. In terms of documentation, Microsoft has so far only released the Public Preview document which highlights the changes between the old and new versions. Microsoft says that it will publish cmdlet documentation for the new Message Trace cmdlets by the time of the general availability, so admins should look out for that.
  • Recent Achievements

    • Week One Done
      Leonard grant earned a badge
      Week One Done
    • One Month Later
      portacnb1 earned a badge
      One Month Later
    • Week One Done
      portacnb1 earned a badge
      Week One Done
    • First Post
      m10d earned a badge
      First Post
    • Conversation Starter
      DarkShrunken earned a badge
      Conversation Starter
  • Popular Contributors

    1. 1
      +primortal
      264
    2. 2
      snowy owl
      158
    3. 3
      +FloatingFatMan
      145
    4. 4
      ATLien_0
      140
    5. 5
      Xenon
      131
  • Tell a friend

    Love Neowin? Tell a friend!