2012-02-13 11 views

答えて

5

これは内部公開されていないインターフェイスであれば、そのインターフェイスとやりとりするすべてのコードを制御する限り自由に変更できます。

しかし、公開されたルールは厳密であり、すべてのインターフェイスには独自の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も同様)を返します。

3

これは確かに派生したインターフェイスを破るので、動作しているように見えても実行しないでください。

代わりに、追加のメソッドを含む新しいインターフェイスを派生させ、新しいIIDに対して追加の機能QIを必要とするクライアントを持つようにします。

+0

これはいいですね、既存のインターフェイスには多くの機能があり、1つしか追加しません。新しいインターフェイスを追加すると大きな変化があるようです。 – Thomson

+1

これは、派生したインターフェイスの実装者がバイナリ互換性を維持できるようにする方法です。 :) –

0

新しいメソッドが追加されている限り、COMインターフェイスは下位互換性がある必要があります。クライアントアプリケーションが新しいCOMインターフェイスを使用する場合、ヘッダーファイル(C++)を更新するか、新しいCOMインターフェイスに参照(.NET)を再度追加する必要があります。また、IIDを更新せずにCOMインターフェースを変更した場合は、OSを再起動する必要があります。結論として、それはIIDを変更することなく動作するでしょうが、IIDを変更する方が正しいかもしれません。

+0

COMインターフェイスは不変です。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms688484(v=vs.85).aspx – TownCube

関連する問題