使用C中的WinRT?

And*_*rew 48 c winapi visual-studio windows-runtime

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

在此输入图像描述

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

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

Pav*_*aev 69

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";
Run Code Online (Sandbox Code Playgroud)

这相当于这个香草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();
Run Code Online (Sandbox Code Playgroud)

将用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);
Run Code Online (Sandbox Code Playgroud)

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

  • `T ^`是对C++/CLI中托管对象的引用.以上是C++/CX,它重用(大多数)WinRT相同的语法.在这种情况下,`T ^`是WinRT对象的智能指针 - 更具体地说,是继承自`IInspectable`的接口(继承自`IUnknown`,因此它们也是COM对象).当你复制它们时,会根据需要调用`AddRef`和`Release`,当它们超出范围时也是如此.如果你``dynamic_cast`某些`T ^`到其他`U ^`,这实际上会做一个`QueryInterface`.还有`T%`类型,它们是`T ^`,因为`U&`是'U*`. (11认同)
  • @PavelMinaev啊!我再看一下标题,目前你的例子中的定义是:`__ x_ABI_CWindows_CUI_CXaml_CControls_CITextBlock`.在尝试你的例子时,这让我很困惑.但是在撰写评论时,我想到的是一个简单,完整,纯粹的C程序 - 这肯定符合OP的问题,值得C粉丝的大量感激. (4认同)
  • 你能在这里解释一下使用抑扬音(^)吗?我认为这是对托管对象的引用,但不是这些COM指针?这段代码在/ real/C++中会怎样? (3认同)
  • 是不是有一个可以使用的ComPtr类,它会使它几乎与^版本相同? (3认同)
  • @Filip`ComPtr <T>`就在那里,但它只会让你摆脱`Release()`调用.我找不到任何`HSTRING`包装器.我想我会保留样本,因此C和C++版本之间的对应关系更加明显. (3认同)
  • @peterchen关于`HSTRING`的好处是,它一方面有一个单独存储的长度,如`BSTR`; 但另一方面,它允许您在将字符串作为参数传递时(通过`WindowsCreateStringReference`)重用现有缓冲区而不进行复制.此外,它的合同说它必须是不可改变的.所以它不仅仅是为了与众不同,而是带来一些真正的好处. (3认同)
  • @PavelMinaev我知道它已经差不多一年了,但您会考虑通过更完整的示例扩展示例,还是链接到更多信息?(我按原样投票,但在同一个地方获得更多信息会很棒.) (3认同)