CCW が取り出せない?
特定の COM Interface から別の COM Interface を取り出そうとすると NullReferenceException が発生する。Unmanaged Code で実装してみると問題なく取り出せるんだけど…。
// 参照設定によって tlbimp が作った [Guid(...)] public interface Ixxx { void GetYYY(out Iyyy); } // 参照設定によって tlbimp が作った [Guid(...)] public interface Iyyy { ... } // アプリケーションコード Ixxx intfX = ...; Iyyy intfY; intfX.GetYYY(out intfY); // throw NullReferenceException
うーん、Ixxx がアレだからかも?とか思いつつ、ちょっと COM Interop について知識不足な気配があるので、適当に試してみる。
// 追加 [Guid(...)] // Ixxx と同じ GUID public Ixxx_2 { void GetYYY([MarshalAs(UnmanagedType.IUnknown)] out object Iyyy); } // アプリケーションコード Ixxx intfX = ...; // 当然この QI() は成功する Ixxx_2 intfX2 = intfX as Ixxx_2; object intfY_obj; intfX.GetYYY(out intfY_obj); // intfY_obj に System.__ComObject が取得できる Iyyy intfY = intfY_obj as Iyyy; // intfY == null、QI() に失敗した。
やはり、COM Interop 経由で自分で自分を参照する CCW を取得することはできないんだろうか。予定ではこの先でこの Iyyy のメソッドの引数に自分自身を RCW としてぶちこむつもりだったのだが。