実装とインターフェイス定義がマネージコードに存在するが、ネイティブコンポーネントによって駆動されるCOMコンポーネントがあります。管理対象コンポーネントはSafeArray、次のメソッド宣言を介してネイティブコードに戻ります。
interface IExample {
<return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN)>
object[] DoSomeOperation()
}
生成されたネイティブ署名は、これを。として適切に返しますSafeArray。
コードレビュー中に、SafeArrayGetElementを使用した結果の配列の呼び出しに関するいくつかの質問がありました。IUnknown問題は、SafeArrayGetElementがAddRefされたインスタンスを返すかどうかです。基本的に、次のうちどれが正しいかを要約します。
例1:
CComPtr<IUnknown> spUnk;
hr = SafeArrayGetElement(pArray, &bounds, reinterpret_cast<void**>(&spUnk));
例2:
IUnknown* pUnk;
hr = SafeArrayGetElement(pArray, &bounds, reinterpret_cast<void**>(&pUnk));
このテーマに関するドキュメントは非常に薄いです。次の行のみが含まれます。
データ要素が文字列、オブジェクト、またはバリアントの場合、関数は要素を正しい方法でコピーします。
正しいの定義は少しあいまいです。