Кто-нибудь знает, как правильно создать объект WinRT в C? Я пытаюсь преобразовать свой код C++, использующий WinRT API, в простой код C. И прямо сейчас я могу заставить работать несколько статических функций WinRT. Однако для объектов, требуемых статической функцией, таких как __FIAsyncOperation_1_Windows_CDevicesCEnumerationCDeviceInformation
для функции get_Completed
в FIAsyncOperation_1_WindowsCDevicesCHumanInterfaceDevice_CHidDeviceVtbl
, я не могу найти правильный способ создания объекта. Во-первых, я не могу найти идентификатор этого объекта в файле idl. Во-вторых, я не уверен в пространстве имен объекта.
Я нашел, как этот класс объявляется в макросе C++,
#ifndef DEF___FIAsyncOperation_1_Windows__CDevices__CEnumeration__CDeviceInformation_USE
#define DEF___FIAsyncOperation_1_Windows__CDevices__CEnumeration__CDeviceInformation_USE
#if !defined(RO_NO_TEMPLATE_NAME)
namespace ABI { namespace Windows { namespace Foundation {
template <>
struct __declspec(uuid("07faa053-eb2f-5cba-b25b-d9d57be6715f"))
IAsyncOperation<ABI::Windows::Devices::Enumeration::DeviceInformation*> : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Devices::Enumeration::DeviceInformation*, ABI::Windows::Devices::Enumeration::IDeviceInformation*>>
{
static const wchar_t* z_get_rc_name_impl()
{
return L"Windows.Foundation.IAsyncOperation`1<Windows.Devices.Enumeration.DeviceInformation>";
}
};
// Define a typedef for the parameterized interface specialization's mangled name.
// This allows code which uses the mangled name for the parameterized interface to access the
// correct parameterized interface specialization.
typedef IAsyncOperation<ABI::Windows::Devices::Enumeration::DeviceInformation*> __FIAsyncOperation_1_Windows__CDevices__CEnumeration__CDeviceInformation_t;
#define __FIAsyncOperation_1_Windows__CDevices__CEnumeration__CDeviceInformation ABI::Windows::Foundation::__FIAsyncOperation_1_Windows__CDevices__CEnumeration__CDeviceInformation_t
/* Foundation */ } /* Windows */ } /* ABI */ }
#endif // !defined(RO_NO_TEMPLATE_NAME)
#endif /* DEF___FIAsyncOperation_1_Windows__CDevices__CEnumeration__CDeviceInformation_USE */
Итак, я попытался использовать этот uuid и name_impl для создания объекта, например
namespace = L"Windows.Foundation.IAsyncOperation`1<Windows.Devices.Enumeration.DeviceInformation>";
hr = WindowsCreateStringReferenceFunc(namespace, (UINT32)wcslen(namespace), &namespace_string_header, &namespace_string);
static const IID async_iid = { 0x07faa053, 0xeb2f, 0x5cba, { 0xb2, 0x5b, 0xd9, 0xd5, 0x7b, 0xe6, 0x71, 0x5f } };
if (SUCCEEDED(hr)) {
__FIAsyncOperation_1_Windows__CDevices__CEnumeration__CDeviceInformation* test;
hr = RoGetActivationFactoryFunc(namespace_string, &async_iid, &test);
if (!SUCCEEDED(hr)) {
printf("Couldn't find Windows.Foundation.IAsyncOperation`1<Windows.Devices.Enumeration.DeviceInformation>: %d\n", hr);
}
}
И после сборки программа возвращается
Couldn't find Windows.Foundation.IAsyncOperation`1<Windows.Devices.Enumeration.DeviceInformation>: -2147221164
Поскольку у меня нет сопоставления кода ошибки, я не знаю, какая часть пошла не так. Так может ли кто-нибудь сказать мне, как правильно создать объект WinRT в c?
Я задал этот вопрос в форум Microsoft, и они ответили, что в настоящее время вопросы и ответы не поддерживают этот тип вопросов. И я также читал этот вопрос раньше, но ответ не может решить мою проблему.
Update1: это код, который я хочу преобразовать из C++ в C
hstring selector = winrt::to_hstring("System.Devices.InterfaceClassGuid:=\"{4D1E55B2-F16F-11CF-88CB-001111000030}\"") +
winrt::to_hstring(" System.DeviceInterface.Hid.VendorId: = ") + winrt::to_hstring(0x0d28) +
winrt::to_hstring(" AND System.DeviceInterface.Hid.ProductId : = ") + winrt::to_hstring(0x0204);
Windows::Foundation::Collections::IVector<hstring> prop{ winrt::single_threaded_vector<hstring>() };
prop.Append(to_hstring("System.ItemNameDisplay"));
prop.Append(to_hstring("System.Devices.DeviceInstanceId"));
prop.Append(to_hstring("System.Devices.Parent"));
prop.Append(to_hstring("System.Devices.LocationPaths"));
prop.Append(to_hstring("System.Devices.Children"));
prop.Append(to_hstring("System.Devices.DeviceManufacturer"));
DeviceInformationCollection collection = DeviceInformation::FindAllAsync(selector, prop).get();
Поскольку в C нет функции get, мне нужно создать асинхронный объект для обработки асинхронной операции в C. Мне также нужно создать объект IVector для перечисления дополнительных свойств устройств.