2

我正在尝试使用 DeviceIoControl 调用IOCTL_BTH_GET_LOCAL_INFO,我相信它可以完成(根据蓝牙配置文件驱动程序 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到错误的设备(蓝牙个人局域网而不是蓝牙无线电)。

因此,我建议您使用BluetoothFindFirstRadio,BluetoothFindNextRadioBluetoothFindRadioClose简单地遍历本地蓝牙无线电,而不是为它们猜测正确的 DOS 设备名称。

于 2012-10-16T07:46:11.553 回答