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/4/8 バイトに変更 (VS オプションあり);
- 8 バイト アラインされた値を使用します (後で、8 バイトより小さいデータ型でも、これが既に起こっていることがわかりました)。しばらくして、どこかで DeviceIoControl がミスアライメントを処理することを読んだので、おそらく心配する必要はありません。
上記の解決策はすべて失敗しました。それは何だと思いますか?VSにはWin32用の構成がたくさんありますが、以前は問題が発生しませんでした(ただし、IOCTLを使用するのは初めてです)。
私は 32feet.NET でそのコードの一部を見たことがありますが、おそらくそれは私のエラーです (違いはわかりません)。