COMサーバーは([in、out] CACLSID * arg)を再割り当てできますか?
-
03-07-2019 - |
質問
次のように宣言されたCOMインターフェイスメソッドを使用:
[ object,
uuid(....),
]
interface IFoo : IUnknown
{
HRESULT Foo([in, out] CACLSID * items);
}
マーシャリングに関して、サーバーはカウントされた配列の再割り当てを許可されていますか? (私はそう思いますが 、もうわかりません)
現在の実装では既存のIDのみが置き換えられますが、新しいインターフェイスを導入せずに、より多くのアイテムを返す可能性のある変更(契約を壊さない)を実装したいと思います。
[編集] CACLSID は既にカウントであり、ポインターを含む配列です。
解決
非常に長い間COMを実行していませんが、新しい配列を割り当てることさえできますか?その場合、 CACLSID ** items
であってはなりませんか?
他のヒント
このCOMライブラリを使用して要素を整列化することにより、非常に多くの要素のスペースを示す2番目のパラメーターとしてCountを指定する必要があります
まず、 Foo
で配列を受け入れる場合は、カウントを与えるパラメーターを追加する必要があります。例:
HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items);
警告:このコードはコンパイルされておらず、ドキュメントから外れています。
第二に、宣言を変更せずにこのメソッドの外部動作を変更することはできません。サイズ変更をサポートするには、配列を再割り当てしてそのアドレスを返すことができる必要があります。 SAFEARRAY
を使用するか、 coos
および items
を、 Foo
がとる元の型へのポインタとして宣言できます。例:
HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items);
また、コンパイルされていないため、これを使用する場合は実際に何をしているかを知る必要があります。
所属していません StackOverflow