3

对于 WinRT,IDL 现在支持如下结构:

[marshaling_behavior(agile)]
[threading(both)]
[activatable(0x06020000)]
[version(0x06020000)]
[static(Windows.Networking.Sockets.IDatagramSocketStatics, 0x06020000)]
runtimeclass DatagramSocket
{
    [default] interface Windows.Networking.Sockets.IDatagramSocket;
    interface Windows.Foundation.IClosable;
}

我很好奇这个static属性。这是什么意思?它与正文中列出的接口有什么关系runtimeclass

4

2 回答 2

8

winrt 接口上的静态方法被实现为该类的类工厂之外的接口。

对于这种情况,您应该调用(省略了很多 winrt 开销):

ComPtr<IDatagramSocketStatics> factory;
HRESULT hr = RoGetActivationFactory(<HSTRING for Windows.Networking.Sockets.DatagramSocket>, __iidof(IDatagramSocketStatics), &factory.GetAddressOf());
hr = factory->DatagramFactoryMethod(<Parameters>);

正如我所提到的,这是伪代码,但应该足以了解如何调用静态方法。

于 2012-10-16T00:20:08.953 回答
5

COM 不支持类的静态方法的概念,所有方法都必须是实例方法,因为接口方法是抽象的。该属性允许语言投影模拟方法的静态行为。特别是 DatagramSocket.GetEndpointPairsAsync() 重载。

值得注意的是,COM 也不支持重载,也可以通过属性解决。IDatagramSockeStatics 的方法有[overload] 属性,第二个重载的真名是GetEndpointPairsWithSortOptionsAsync()。

于 2012-10-15T18:44:45.623 回答