1

蓝牙 API 的 Microsoft 文档(例如)BluetoothGetDeviceInfo提供了使用静态或动态导入调用这些函数的说明。

与 链接的静态导入bthprops.lib工作正常。

#include <windows.h>
#include <BluetoothAPIs.h>

#include <iostream>

int main(int argc, char** argv)
{
    BLUETOOTH_DEVICE_INFO binfo = {};
    binfo.dwSize = sizeof binfo;
    binfo.Address.ullLong = 0xBAADDEADF00Dull;
    auto result = ::BluetoothGetDeviceInfo(nullptr, &binfo);
    std::wcout << L"BluetoothGetDeviceInfo returned " << result
               << L"\nand the name is \"" << binfo.szName << "\"\n";
    return 0;
}

但这在超便携代码中并不理想,因为文档说在 Windows XP SP2 之前它们不受支持。所以应该使用动态链接并从丢失的功能中恢复。bthprops.dll但是,按照 MSDN 文档的指示动态加载失败:

decltype(::BluetoothGetDeviceInfo)* pfnBluetoothGetDeviceInfo;
bool LoadBthprops( void )
{
    auto dll = ::LoadLibraryW(L"bthprops.dll");
    if (!dll) return false;
    pfnBluetoothGetDeviceInfo = reinterpret_cast<decltype(pfnBluetoothGetDeviceInfo)>(::GetProcAddress(dll, "BluetoothGetDeviceInfo"));
    return pfnBluetoothGetDeviceInfo != nullptr;
}

应该如何动态链接到这些功能?

4

1 回答 1

3

显然,这一事实对 Google 来说是众所周知的,但对 MSDN 来说却不是。如果要动态加载这些函数,请使用正确的 DLL 名称,这与函数文档中的 nice 表相反。LoadLibrary("bthprops.cpl")

这有效:

decltype(::BluetoothGetDeviceInfo)* pfnBluetoothGetDeviceInfo;
bool LoadBthprops( void )
{
    auto dll = ::LoadLibraryW(L"bthprops.cpl");
    if (!dll) return false;
    pfnBluetoothGetDeviceInfo = reinterpret_cast<decltype(pfnBluetoothGetDeviceInfo)>(::GetProcAddress(dll, "BluetoothGetDeviceInfo"));
    return pfnBluetoothGetDeviceInfo != nullptr;
}
于 2013-10-17T20:19:56.787 回答