我正在尝试使用 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/4/8 字节(使用 VS 选项);
- 使用 8 字节对齐的值(后来我发现这已经发生了,即使数据类型小于 8 字节)。一段时间后,我在某处读到 DeviceIoControl 为您处理错位问题,因此可能无需担心。
上述所有解决方案都失败了。你觉得它是什么?VS 有很多针对 Win32 的配置,但是以前从来没有给我带来过问题(虽然是第一次使用 IOCTL)。
我已经在 32feet.NET 上看到了其中的一些代码,所以这可能只是我的一个错误(我看不出有任何区别)。