Вопрос по c, visual-studio, winapi, windows-runtime – Использование WinRT из C?

47

Просматривая материал // BUILD, я увидел, что WinRT API можно использовать кодом C:

Я довольно взволнован свежим C API, доступным для разработчиков Win32.

Где я могу найти информацию о C WinRT API? Чем он лучше существующего Win32 C API?

Мир полон компиляторов Си. MS не имеет компилятора C и не имеет его в течение многих лет. Зачем им начинать сейчас? David Heffernan
@Lothar: быстрый поиск в Google привел к блогу команды Visual Studio, который подтверждает, что поддержка C99 не улучшится. Ищите «C99» в статье, и вы увидите, что VC11 не будет поддерживать новые функции по сравнению с VC10.blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx paercebal
Было бы довольно мазохистски использовать WinRT из C. David Heffernan
@Andrew Вам придется использовать WinRT для пользовательского интерфейса в приложениях Metro, Win32 на самом деле не вариант. Разрешены некоторые вызовы Win32, но не большинство связанных с пользовательским интерфейсом. Pavel Minaev
@Mark Расширения не требуются, они просто делают вашу жизнь проще. Pavel Minaev

Ваш Ответ

1   ответ
68

поэтому использование компонентов WinRT из C похоже на использование компонентов COM из C. Как и раньше, вы получаете файлы .idl для всех компонентов WinRT, а также файлы .h, созданные из этих файлов .idl. Файлы .h содержат объявления как C ++, так и C (обернутые в#ifdef __cplusplus по мере необходимости). Вы можете просто # включить их и начать взламывать.

Это не совсем аккуратно, например, например. что-то вроде этого C ++ / CX:

Windows::UI::Xaml::Controls::TextBlock^ tb = ...;
tb->Text = "Foo";

что эквивалентно этому ванильному C ++:

Windows::UI::Xaml::Controls::ITextBlock* tb = ...;
HSTRING hs;
HRESULT hr = WindowsStringCreate(L"Foo", 3, &hs);
// check hr for errors
hr = tb->set_Text(hs);
// check hr for errors
tb->Release();

будет написано в C как:

__x_Windows_CUI_CXaml_CControls_CITextBlock* tb = ...;
HRESULT hr;
HSTRING hs;
hr = WindowsCreateString(L"Foo", 3, &hs);
// check hr for errors
hr = __x_Windows_CUI_CXaml_CControls_CITextBlock_put_Text(tb, hs);
// check hr for errors
IUnknown_Release(tb);

Загляните в "C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Include \ winrt" в Preview для разработчиков, чтобы увидеть файлы .idl и .h.

Разве нет класса ComPtr, который можно было бы использовать и который сделал бы его почти идентичным версии ^? Filip Frącz
Можете ли вы объяснить использование окружности (^) здесь? я думал, что это для ссылок на управляемые объекты, но разве это не указатели COM? как этот код будет выглядеть в / real / C ++? Spongman
T^ являются ссылками на управляемые объекты в C ++ / CLI. Выше приведен скорее C ++ / CX, который использует (большинство) тот же синтаксис для WinRT. В этом случае,T^ являются умными указателями на объекты WinRT, а точнее на интерфейсы, наследуемые отIInspectable (который в свою очередь наследует отIUnknownпоэтому они также являются COM-объектами). Когда вы копируете их,AddRef а такжеRelease называются по мере необходимости, и то же самое, когда они выходят за рамки. если тыdynamic_cast несколькоT^ к другомуU^, это будет на самом делеQueryInterface, Это такжеT% типы, которые должныT^ какU& это кU*. Pavel Minaev
@FilipComPtr<T> есть, но это только позволит вам избавиться отRelease() вызов. Я не мог найти ни одногоHSTRING обертка. Я думаю, что оставлю образец как есть, чтобы соответствие между версиями C и C ++ было более очевидным. Pavel Minaev
@PavelMinaev Ах! Я еще раз взглянул на заголовки, и в настоящее время определение из вашего примера:__x_ABI_CWindows_CUI_CXaml_CControls_CITextBlock, Это то, что смутило меня, когда опробовал твой пример. Однако при написании комментария я имел в виду минимальную, полную, чистую программу на C, которая, безусловно, соответствовала бы вопросу OP и заслуживала огромной благодарности от поклонников C. Ivan Vučica

Похожие вопросы