1

サードパーティの COM サービスを使用しています。.NET アセンブリから公開されます。このサービスが提供するいくつかのインターフェイスがあり、実際に C++ アプリケーションで (事前バインディングを使用して) 使用できます。実際には、これらのインターフェイスを使用してカスタム データを渡すことができるかどうかを知りたいです。つまり、これらのインターフェイスが提供するものでは十分ではなく、そこにいくつかのデータ/メソッドを追加したいと考えています (ただし、インターフェイスは私のものではないため、できません)。それを変更)。可能であればアドバイスをお願いします。そうでない場合は、回避策があるかもしれません (例は非常に役立ちます)。

サードパーティの COM サービスを介してプロデューサーからコンシューマーにカスタム データを渡すことができるかどうかを理解しようとしています。自分のメソッドを含み、サードパーティの ISomething を継承する独自のインターフェイスを作成して使用する必要があるのでしょうか?

以下は、問題を示すコードです。助けてくれて本当にありがとうございます...

1)プロデューサーからコンシューマーにデータを渡すために使用しているクラス(サードパーティのCOMサービスを介して):

//ISomething is 3-rd party interface with some limited # of data and methods

//Something is my class that will be used to pass data where ISomething is asked 
//and it contains some methods that I need and they are not defined in ISomething
class Something: public CComObjectRootEx<CComSingleThreadModel>,  public IDispatch
{
private:
    bstr_t Name;
    bstr_t MyData;

public: 

    //COM map omitted

    //Method defined in ISomething
    STDMETHOD(get_Name)(BSTR * pRetVal)     
    { 
        *pRetVal = ::SysAllocString(Name);
        return S_OK;
    }
    //Method defined in ISomething
    STDMETHOD(put_Name)(BSTR pRetVal)           
    { 
        Name = pRetVal; 
        return S_OK;
    }

    **//Method that is NOT defined in ISomething**
    STDMETHOD(get_MyData)(BSTR * pRetVal)           
    { 
        MyData= pRetVal; 
        return S_OK;
    }

    **//Method that is NOT defined in ISomething**
    STDMETHOD(put_MyData)(BSTR pRetVal)         
    { 
        MyData = pRetVal; 
        return S_OK;
    }
}

2) データ プロデューサーがデータを入力し、それをサード パーティの COM サービスに渡します。

CComObject<Something> *Obj = NULL;
CComObject<Something>::CreateInstance(&Obj);

//Calling method defined in ISomething
Obj->put_Name(_bstr_t("Some data"));

**//Calling method that is NOT defined in ISomething**
Obj->put_MyData(_bstr_t("My data"));

//Passing data to COM service
CComPtr<ISomething> iObj;
Obj->QueryInterface(__uuidof(ISomething),(void **) &iObj);

CComPtr<ICommand> command = //init omitted, it's another 3-rd party object;
//Setting data
command->do(iObj);

3) 私のデータ コンシューマは、定義済みデータと未定義データの両方を取得しようとしますが、定義済みデータの取得にのみ成功し、未定義にはガベージが含まれます

class SomethingEventSink : public CComObjectRootEx<CComSingleThreadModel>, 
                     public IDispatch
{

    //COM map omitted

    STDMETHOD(SomethingEventHandler)(VARIANT sender, struct _SomethingEventArgs *args)  
    {

        ISomething* obj;
        Something* extObj;

        args->get_Something(&obj);

        BSTR Name, Name1, MyData;

        //Works fine
        obj->get_Name(&Name);

        //Casting to my object pointer
        extObj = reinterpret_cast<Something*>(obj)

        //Works fine
        extObj->get_Name(&Name1);

        **//Works, but NO DATA I've set at producer step**
        **//HOW TO MAKE IT WORK?**
        extObj->get_MyData(&MyData);

        return S_OK;
    }
}
4

1 に答える 1

0

あなたがやろうとしていることは、あなたがやっている方法では不可能です。ただし、独自の新しいインターフェイスを宣言できれば、それを機能させることができるでしょうか?

この場合、オブジェクトは ISomething と IMyInterface を実装でき、必要な新しいメソッドを持つように IMyInterface を定義できます。

于 2012-06-09T02:11:43.620 に答える