2012-10-15 108 views
3

对于WinRT中,IDL现在支持结构,比如这个: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正文中列出的接口有什么关系?

回答

5

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

值得注意的是,COM也不支持重载,也用属性解决。 IDatagramSockeStatics的方法具有[overload]属性,第二个重载的实际名称是GetEndpointPairsWithSortOptionsAsync()。

8

在一个winrt接口上的静态方法被实现为该类的类工厂的接口。

对于这种情况,你应该调用(多WinRT的开销省略掉):

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

正如我所说,这是伪代码,但它应该是足够的,看看如何调用静态方法。

+0

你的评论也很有用,因为它告诉你如何调用静态;汉斯的回答字面上回答了我关于静态属性意味着什么的问题,所以我接受了他的答案。 –

+0

我给出单独回答的原因是为了表示与“Windows.Foundation.Metadata.StaticAttribute”属性相关的二进制行为 - 二进制行为根本不清楚属性。 –