2

DeviceIoControl を使用してIOCTL_BTH_GET_LOCAL_INFOを呼び出そうとしていますが、これは実行できると思います ( Bluetooth Profile Driver IOCTLs に従って)。

私はVisual Studio 2012を使用してWindows 7 x64を使用しています(おそらくデフォルト設定で)。

ハンドルには有効な値があります (検証コードを削除しました) が、DeviceIoControl は常に ERROR_INVALID_USER_BUFFER (エラー 1784) を返します。

コードは次のとおりです。

int main() {

    BTH_LOCAL_RADIO_INFO buffer;
    BOOL fStatus;
    HANDLE h;
    DWORD returned = 0;

    h = CreateFile(
        TEXT("\\\\.\\BthPan"), 
        GENERIC_READ | GENERIC_WRITE ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL, 
        OPEN_EXISTING,
        0,
        NULL);


    fStatus = DeviceIoControl(
            h, 
            IOCTL_BTH_GET_LOCAL_INFO,
            NULL, 0,
            (LPVOID)&buffer, sizeof(BTH_LOCAL_RADIO_INFO),
            &returned,
            (LPOVERLAPPED) NULL
            );   
(...)

いくつかの調査の後、次の解決策を試しました。

  1. 構造体パックのアラインメントを 1/4/8 バイトに変更 (VS オプションあり);
  2. 8 バイト アラインされた値を使用します (後で、8 バイトより小さいデータ型でも、これが既に起こっていることがわかりました)。しばらくして、どこかで DeviceIoControl がミスアライメントを処理することを読んだので、おそらく心配する必要はありません。

上記の解決策はすべて失敗しました。それは何だと思いますか?VSにはWin32用の構成がたくさんありますが、以前は問題が発生しませんでした(ただし、IOCTLを使用するのは初めてです)。

私は 32feet.NET でそのコードの一部を見たことがありますが、おそらくそれは私のエラーです (違いはわかりません)。

4

1 に答える 1

1

間違ったデバイスに送信IOCTL_BTH_GET_LOCAL_INFOしています (Bluetooth ラジオではなく Bluetooth パーソナル エリア ネットワーク)。

したがって、正しい DOS デバイス名を推測するのではなく、 を使用して、ローカルの Bluetooth 無線を単純に繰り返すことBluetoothFindFirstRadioをお勧めします。BluetoothFindNextRadioBluetoothFindRadioClose

于 2012-10-16T07:46:11.553 に答える