Windows Bluetooth API

Bluetooth 関連の API は BluetoothAPIs.h

ヘッダにも詳しく使い方や説明が書かれているため、ヘッダ見た方が
わかりやすいようです。(XP SP2 以降)

//Bluetooth インターフェース検索

#include	
#include	
#include	 // 必要
#include	

BLUETOOTH_FIND_RADIO_PARAMS	param;
memset( ¶m, 0, sizeof(BLUETOOTH_FIND_RADIO_PARAMS) );
param.dwSize= sizeof(BLUETOOTH_FIND_RADIO_PARAMS);

HANDLE	hradio= NULL;
HBLUETOOTH_RADIO_FIND	hfind= NULL;

if( hfind= BluetoothFindFirstRadio( ¶m, &hradio ) ){
	do{
		BLUETOOTH_RADIO_INFO	rinfo;
		memset( &rinfo, 0, sizeof(BLUETOOTH_RADIO_INFO) );
		rinfo.dwSize= sizeof(BLUETOOTH_RADIO_INFO);
		BluetoothGetRadioInfo( hradio, &rinfo );

		// rinfo.szName  Local Hostname
		// rinfo.address Local Address

		~

		CloseHandle( hradio );
	}while( BluetoothFindNextRadio( hfind, &hradio ) );
	BluetoothFindRadioClose( hfind );
}

これで hRadio や Local の Address が得られます。

ただ Device 関連の API で hRadio が必要な部分はほぼ全部 NULL を
渡すことができるため、あまり必要ないかもしれません。
NULL だと全部の Bluetooth interface が対象。

//Device の検索
BLUETOOTH_DEVICE_SEARCH_PARAMS	searchparam;
memset( &searchparam, 0, sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS) );
searchparam.dwSize= sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS);
searchparam.fReturnAuthenticated= TRUE;
searchparam.fReturnRemembered= TRUE;
searchparam.fReturnConnected= TRUE;
searchparam.fReturnUnknown= TRUE;
searchparam.fIssueInquiry= FALSE;
searchparam.cTimeoutMultiplier= 0;
searchparam.hRadio= NULL; // all

HBLUETOOTH_DEVICE_FIND	hfind= NULL;
BLUETOOTH_DEVICE_INFO	devinfo;
memset( &devinfo, 0, sizeof(BLUETOOTH_DEVICE_INFO) );
devinfo.dwSize= sizeof(BLUETOOTH_DEVICE_INFO);
if( hfind= BluetoothFindFirstDevice( &searchparam, &devinfo ) ){
	do{
		// devinfo.szName        デバイス名
		// devinfo.Address       アドレス
		// devinfo.fConnected
		// devinfo.fRemembered
		// devinfo.fAuthenticated
	}while( BluetoothFindNextDevice( hfind, &devinfo ) );
	BluetoothFindDeviceClose( hfind );
}

これで Wiiリモコン/バランスWiiボード 等も列挙できます。
新しいデバイスの検出も行う場合は searchparam.fIssueInquiry= TRUE、
searchparam.cTimeoutMultiplier= 10 くらいに。

パスキーは
wchar_t* passkey= ~;
unsigned long passlen= wcslen(passkey)*sizeof(wchar_t);
BluetoothAuthenticateDevice( NULL, NULL, &devinfo, passkey, passlen );

または
BluetoothRegisterForAuthentication() → Callback →
BluetoothSendAuthenticationResponse()
BluetoothUnregisterAuthentication()
の手順で行うようです。Dialog を表示させて手入力も可能。

サービス一覧(enable のものだけ)
BluetoothEnumerateInstalledServices( NULL, &devinfo, &numofbuf, _guidbuf );

サービスの切り替え
BluetoothSetServiceState( hradio, &devinfo, &_guid,
BLUETOOTH_SERVICE_ENABLE or BLUETOOTH_SERVICE_DISABLE );

BluetoothEnumerateInstalledServices() は Enable のものだけ列挙する
ので、EnumerateInstalledServices で取得した GUID に対して
SetServiceState( ~ENABLE ) すると必ずエラーになります。
既に ENABLE なため。DISABLE には使える。

pass key 無しで Device を追加登録する方法がまだわかりません。

参考ページ
MSDN BluetoothFindFirstRadio Function
・VS2008 \Microsoft SDKs\Windows\v6.0A\Include\BluetoothAPIs.h