【问题标题】:Using WinRT from C?从 C 中使用 WinRT?
【发布时间】:2011-11-18 03:59:02
【问题描述】:

观看 //BUILD 的东西,我看到 WinRT API 可以被 C 代码使用:

我对 Win32 开发人员可用的全新 C API 感到非常兴奋。

在哪里可以找到有关 C WinRT API 的信息?它比现有的 Win32 C API 好在哪里?

【问题讨论】:

  • @Mark 扩展不是必需的,它们只是让您的生活更轻松。
  • @Andrew 您将不得不在 Metro 应用程序中为 UI 使用 WinRT,Win32 并不是一个真正的选择。允许一些 Win32 调用,但不是大多数与 UI 相关的调用。
  • @Lothar :快速的 Google 搜索导致了 Visual Studio 团队的博客,这证实了 C99 的支持不会变得更好。在文章中搜索“C99”,您会发现VC11 与VC10 相比将不支持新功能。 blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
  • 从 C 中使用 WinRT 会相当自虐。
  • 世界上到处都是 C 编译器。 MS 没有 C 编译器,而且多年来一直没有。他们为什么要现在开始?

标签: c visual-studio winapi windows-runtime


【解决方案1】:

WinRT 本质上是 COM,因此使用 C 语言的 WinRT 组件就像使用 C 语言的 COM 组件一样。像以前一样,您可以获得所有 WinRT 组件的 .idl 文件,以及从这些 .idl 文件生成的 .h 文件。 .h 文件包括 C++ 和 C 声明(根据需要包装在 #ifdef __cplusplus 中)。您只需#include 它们并开始破解。

不过,它并不完全整洁,例如像这样的 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);

在 Developer Preview 中查看“C:\Program Files (x86)\Windows Kits\8.0\Include\winrt”以查看 .idl 和 .h 文件。

【讨论】:

  • 你能解释一下这里的抑扬符(^)的用法吗?我认为这是对托管对象的引用,但这些不是 COM 指针吗?这段代码在 /real/ C++ 中的外观如何?
  • T^ 是对 C++/CLI 中托管对象的引用。以上是 C++/CX,它为 WinRT 重用(大部分)相同的语法。在这种情况下,T^ 是指向 WinRT 对象的智能指针 - 更具体地说,指向从 IInspectable 继承的接口(后者又从 IUnknown 继承,因此它们也是 COM 对象)。当你复制它们时,AddRefRelease 会根据需要被调用,当它们超出范围时也是如此。如果你 dynamic_cast 一些 T^ 到其他一些 U^,这实际上会做一个 QueryInterface。还有T% 类型,它们对应于T^,就像U& 对应于U*
  • 难道没有一个可以使用的 ComPtr 类,它可以使它与 ^ 版本几乎相同吗?
  • @Filip ComPtr<T> 在那里,但它只会让你摆脱Release() 的电话。我找不到任何 HSTRING 包装器。我想我将保留示例,以便 C 和 C++ 版本之间的对应关系更加明显。
  • @PavelMinaev 啊!我又看了一眼标题,目前您示例中的定义是:__x_ABI_CWindows_CUI_CXaml_CControls_CITextBlock。在尝试您的示例时,这让我感到困惑。不过,在写评论时,我想到的是一个最小的、完整的、纯 C 程序——它肯定符合 OP 的问题,值得 C 的粉丝们非常感谢。
猜你喜欢
  • 2017-11-17
  • 2012-06-08
  • 2013-04-07
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多