1

如何声明一个继承自Windows.Foundation.IClosableC++/CX 的运行时接口?

这两种尝试都会产生编译器错误:

public interface class MyInterface : Windows::Foundation::IClosable {
   /* bla bla */
};
==> error C2039: 'IClosable' : is not a member of 'Windows::Foundation'

public interface class MyInterface {
   /* bla bla */
   ~MyInterface();
};
==> error C2849: 'MyInterface' : an interface cannot have a destructor

然而,这种继承在 Windows 运行时中是绝对禁止的,因为某些系统提供的接口确实继承自IClosable——例如,IInputStream.

我想我可以在 IDL 中定义,然后在编译 C++ 代码之前使用 midlrt.exeMyInterface将其转换为外部文件。.winmd不过,这对我的构建过程来说是一个不受欢迎的复杂化。有没有办法将其指定为 C++/CX 源?

4

1 回答 1

2

只有在不使用 C++/CX 时才能从 IClosable 继承。

你得到第一个错误的原因是因为这个接口不是 Windows.winmd 元数据的一部分。此接口在 windows.foundation.h 文件 ABI::Windows::Foundation 命名空间中声明。

出现第二个错误是因为接口不能有析构函数。

MSDN:当您声明公共析构函数时,编译器会生成代码,以便 ref 类实现 Platform::IDisposable 并且析构函数实现 Dispose 方法。Platform::IDisposable 是 Windows::Foundation::IClosable 的 C++/CX 投影。永远不要显式地实现这些接口。

于 2013-01-30T07:23:04.753 回答