そこで、アプリケーションの予期しないクラッシュをBluetoothSelectDevices関数に絞り込みました。ユーザーによるデバイスの選択を許可することになっています。
#include <windows.h>
#include <Bthsdpdef.h>
#include <BluetoothAPIs.h>
#pragma comment(lib, "bthprops")
#pragma comment(lib, "user32")
bool getDevice(void)
{
BLUETOOTH_SELECT_DEVICE_PARAMS btsdp = { sizeof(btsdp) };
btsdp.hwndParent = NULL; // hDlg; // "set to NULL for no parent."
btsdp.fShowUnknown = TRUE;
// btsdp.fAddNewDeviceWizard = TRUE;
btsdp.fShowAuthenticated = TRUE;
BOOL b = BluetoothSelectDevices( &btsdp );
if ( b )
{
// BLUETOOTH_DEVICE_INFO * pbtdi = btsdp.pDevices;
// for ( ULONG cDevice = 0; cDevice < btsdp.cNumDevices; cDevice ++ )
// {
// if ( pbtdi->fAuthenticated || pbtdi->fRemembered )
// {
// //
// // TODO: Do something usefull with the device info
// //
// }
//
// pbtdi = (BLUETOOTH_DEVICE_INFO *) ((LPBYTE)pbtdi + pbtdi->dwSize);
// }
BluetoothSelectDevicesFree( &btsdp );
}
else
{
if (GetLastError() != ERROR_CANCELLED)
MessageBox(NULL, "BluetoothSelectDevices failed.", "Error", MB_OK);
return false;
}
return true;
}
int main(void){for (int i = 0; i < 10 && getDevice(); i++);return 0;}
最終的にアクセス違反が発生しますが、しばらくは完全に実行される可能性があります (テストを簡単にするためにループに入れたのはそのためです)。
かなりのフラストレーションの後、「BluetoothAPIs.h」ファイルに移動し、上記のコードをマイクロソフトの提案どおりにほぼそのままコピーしました!! 不要な部分もコメントアウトしました。VC9 では、コンパイル行は次のように単純です: "cl /ZI /RTCcsu main.cpp"
おそらく誰かが私が間違っていることを提案できますか?
デバッガーは役に立ちません。カーネルの 0x6CD1DCD9 でエラーが発生しているだけです。以下で行うように、すべてのパラメーターを明示的に設定しても違いはありません。
memset(&btsdp, 0, sizeof(btsdp));
btsdp.dwSize = sizeof(BLUETOOTH_SELECT_DEVICE_PARAMS);
btsdp.cNumOfClasses = 0; // search for all devices
btsdp.prgClassOfDevices = NULL;
btsdp.pszInfo = L"Select Device..";
btsdp.hwndParent = NULL;
btsdp.fForceAuthentication = FALSE;
btsdp.fShowAuthenticated = TRUE;
btsdp.fShowRemembered = TRUE;
btsdp.fShowUnknown = TRUE;
btsdp.fAddNewDeviceWizard = FALSE;
btsdp.fSkipServicesPage = FALSE;
btsdp.pfnDeviceCallback = NULL; // no callback
btsdp.pvParam = NULL;
btsdp.cNumDevices = 0; // no limit
btsdp.pDevices = NULL;
前もって感謝します。