如何使用 WRL 在 Win32 控制台应用程序中激活 IWiFiDirectDevice?

How to activate IWiFiDirectDevice in Win32 Console APP using WRL?

我想在 Win32 控制台应用程序中使用来自 Windows 10 SDK 的 WiFi Direct 的 WinRT API。我了解 C++/CX(甚至在这方面取得了一些进展),但仍然希望在没有此扩展的情况下使用它。

我的问题是我无法激活 IWifiDirectDevice 接口(来自 ABI::Windows::Devices::WiFiDirect)来访问提供 GetDeviceSelector 方法的 IWifiDirectDeviceStatics。

HStringReference strDevice(RuntimeClass_Windows_Devices_WiFiDirect_WiFiDirectDevice);

ComPtr<IInspectable> insp;
hr = RoActivateInstance(strDevice.Get(), insp.GetAddressOf());

此代码最终以 E_NOTIMPL 作为结果。在 Microsoft 的 example 中,他们使用工厂来激活,但 ABI::Windows::Devices::WiFiDirect 命名空间没有工厂。

值得一提的是,按照我之前编写的方式激活 IWifiDirectAdvertisementPublisher 后工作正常。

那么如何从WRL激活IWifiDirectDevice呢?

Windows.Devices.WiFiDirect.WiFiDirectDevice 不是可激活的 class。您可以通过查看 windows.devices.wifidirect.idl.

看到这一点

您将需要使用静态方法,例如:

HStringReference strDevice(RuntimeClass_Windows_Devices_WiFiDirect_WiFiDirectDevice);

ComPtr<IWiFiDirectDeviceStatics> wiFiDirectDeviceStatics;
hr = Windows::Foundation::GetActivationFactory(
    strDevice.Get(),
    &wiFiDirectDeviceStatics);

ComPtr<IWiFiDirectDevice> wiFiDirectDevice;
ComPtr<IAsyncOperation<WiFiDirectDevice*>> asyncOperation;
hr = wiFiDirectDeviceStatics->FromIdAsync(deviceId.Get(), &asyncOperation);

考虑看看 Wi-Fi Direct sample