1

などの Bluetooth 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.dllMSDN ドキュメントで指示されている動的読み込みは失敗します。

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 名を使用してください。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 に答える