サードパーティの 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;
}
}