COMインターフェイスに新しいメソッドを追加して、既存のものを変更せずにこのメソッドを使用する前に、コンシューマとの互換性を失ってしまいますか?既存のCOMインターフェイスに新しい関数を追加するとバイナリ互換性が失われますか?
答えて
これは内部公開されていないインターフェイスであれば、そのインターフェイスとやりとりするすべてのコードを制御する限り自由に変更できます。
しかし、公開されたルールは厳密であり、すべてのインターフェイスには独自のIIDがあります。メソッドを変更、追加、または削除することによって、そのインターフェイスを変更することができます。これはまったく新しいインターフェイスであり、新しいIIDが必要です。
しかし、COMはその新しいインターフェイスがどのように実装されているか気にしません。そのため、新しいメソッドを追加するだけの古いインターフェイスの派生としてクラスを実装し、 QIが古いインタフェースか新しいインタフェースのどちらかを要求されたときに、適切なインタフェースを返す限りです。例えば
:だから
class IInterfaceOriginal: public IUnknown
{
public:
...
// lots of methods
...
};
class IInterfaceUpdated: public IInterfaceOriginal
{
public:
// Add just one additional method
STDMETHOD(AdditionalMethod)(...) = 0;
};
class CImplementation: IInterfaceNew // this was IInterfaceOld
{
// Also add implemention of AdditionalMethod somewhere here...
HRESULT STDMETHODCALLETYPE QueryInterface(REFIID riid, void **ppvObject)
{
*ppvObject = NULL;
if(riid == __uuidof(IUnknown)
|| riid == __uuidof(IInterfaceOriginal)
|| riid == __uuidof(IInterfaceUpdated)) // This is added
{
// Return a IInterfaceUpdated in response to a QI for either of IUnknown,
// or the old or new interface. This works because in C++, any IInterfaceUpdaed
// is also both of those two other interfaces.
*ppvObject = static_cast<IInterfaceUpdated*>(this);
}
else
return E_UNKNOWN;
return ((IUnknown*)*ppvObject)->AddRef();
}
...
}
、あなたが技術的にあなたが実際にここで少しのコードを追加している、「別のインターフェイスを追加」している間:ちょうど古いものから派生した新しいインタフェースを定義する、インターフェースを変更(新しいメソッドの実装を追加する)、そして最後にQIを更新して古いメソッドと新しいメソッドの両方をサポートするようにして、両方のインターフェイス(とIUnknownも同様)を返します。
これは確かに派生したインターフェイスを破るので、動作しているように見えても実行しないでください。
代わりに、追加のメソッドを含む新しいインターフェイスを派生させ、新しいIIDに対して追加の機能QIを必要とするクライアントを持つようにします。
新しいメソッドが追加されている限り、COMインターフェイスは下位互換性がある必要があります。クライアントアプリケーションが新しいCOMインターフェイスを使用する場合、ヘッダーファイル(C++)を更新するか、新しいCOMインターフェイスに参照(.NET)を再度追加する必要があります。また、IIDを更新せずにCOMインターフェースを変更した場合は、OSを再起動する必要があります。結論として、それはIIDを変更することなく動作するでしょうが、IIDを変更する方が正しいかもしれません。
COMインターフェイスは不変です。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms688484(v=vs.85).aspx – TownCube
- 1. enum値を追加するとバイナリ互換性が損なわれますか?
- 2. クラスに新しいメンバ変数を追加することはバイナリ互換性に影響しますか?
- 3. Linuxで静的な変数バイナリ互換性を追加できますか?
- 4. 依存関係を更新すると下位互換性が損なわれますか(メジャーバージョンのセマフォー変更)?
- 5. プライベートメンバー変数を追加するとC++ ABIとの互換性が損なわれますか?
- 6. dのポインタクラスのブレークバイナリ互換性に新しいメンバ関数を追加しますか?
- 7. Rubyの下位互換性を維持しながら、関数に新しいargsを追加する
- 8. 既存のモデルに新しいhas_many関係を追加する
- 9. 既存の(標準)パッケージに新しい関数を追加する
- 10. .NETコアはCOMと互換性がありますか?
- 11. 仮想関数のためバイナリ互換性が中断しました
- 12. hybrisの既存のアイテムタイプに新しい属性を追加するには?
- 13. Inproc COMサーバーに新しいインターフェイスを追加して実装する方法
- 14. プライベート関数から `static`を削除するとABIの互換性が損なわれますか?
- 15. 何とかCOMオブジェクトインスタンスが失われる
- 16. 新しいオブジェクトクラス/属性を既存のldapエントリに追加するとエラーが返される
- 17. 既存のオブジェクトへのインターフェイスの追加
- 18. コアデータ軽量移行 - 既存のエンティティに新しい属性が追加されていますか?
- 19. 既存の要素ノードに新しい属性を追加する
- 20. 既存の関数にインクリメンタルな数字を追加する
- 21. j2me polishバイナリ互換性
- 22. 既存のクラスに新しいスロットを追加するには?
- 23. DEXとDalvikはJavaのバイナリ互換性をサポートしていますか?
- 24. Polymer-IE11との互換性、関数名の前に新しいキーワードを取得
- 25. Rhapsodyの互換性のないOSALインターフェイス
- 26. レルムの既存のリストに新しいオブジェクトを追加する
- 27. 既存のプロジェクトの新しいデバイスにプロビジョニングプロファイルを追加する
- 28. ソースの非互換性は、常にバイナリの非互換性を意味しますか?
- 29. 新しい関数を追加するために古いものに新しいC++インターフェイスを作成する
- 30. SSISスクリプトタスク既存のファイルをリンクとしてプロジェクトに追加するとバイナリが見つからない
これはいいですね、既存のインターフェイスには多くの機能があり、1つしか追加しません。新しいインターフェイスを追加すると大きな変化があるようです。 – Thomson
これは、派生したインターフェイスの実装者がバイナリ互換性を維持できるようにする方法です。 :) –