この質問で私の好ましい解決策は不可能であると言われた後、私は現在、回避策を実装しようとしています。C ++ / CXでIClosableから継承するインターフェイスを宣言する代わりに、生のIDLで宣言しています。しかし、それもうまくいかないようです。
FooSpace.idl
を含むIDLファイルを作成しました
import "inspectable.idl";
import "Windows.Foundation.idl";
namespace FooSpace
{
[uuid(01234567-89AB-CDEF-FEDC-BA9876543210)]
[version(42)]
interface Foo : IInspectable requires Windows.Foundation.IClosable
{
}
}
とそれからWindowsランタイムメタデータを生成します
midlrt /nomidl /metadata_dir "C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral" FooSpace.idl
FooSpace.winmd
を使用して分解すると、生成されたものは問題なく表示されますildasm
。特に、システムが提供する場合とまったく同じように、Foo
から継承しているように見えます。IClosable
IInputStream
Windows.winmd
ただし、C ++ / CXから使用しようとすると、実装すらしていません。当面の間、他の誰かがWRLなどで実装したふりをして、機能しないようです。これが私のテストC++/CXソースファイルです。
void works(Windows::Storage::Streams::IInputStream^ istream) {
Platform::IDisposable^ local = istream ;
}
void doesnt(FooSpace::Foo^ foo) {
Platform::IDisposable^ local = foo ;
}
これはエラーを生成しますが、エラーは生成しFoo
ませんIInputStream
:
C:\cygwin\tmp>cl /nologo /c /ZW /FU FooSpace.winmd testit.cpp
testit.cpp
testit.cpp(5) : error C2440: 'initializing' : cannot convert from 'FooSpace::Foo ^' to 'Platform::IDisposable ^'
No user-defined-conversion operator available, or
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
私はここで何が間違っているのですか?
一方、同等のC#コードは正常にコンパイルされるようです。
public class Whatever {
public static void Works(Windows.Storage.Streams.IInputStream istream) {
System.IDisposable local = istream ;
}
public static void AlsoWorks(FooSpace.Foo foo) {
System.IDisposable local = foo ;
}
}