我正在使用 3-rd 方 COM 服务。它从 .NET 程序集中暴露出来。这个服务提供了几个接口,实际上我可以在我的 C++ 应用程序中使用(使用早期绑定)。实际上我想知道是否可以通过使用这些接口传递自定义数据,即对我来说,这些接口提供的内容还不够,我想在那里添加一些额外的数据/方法(虽然接口不是我的,所以我不能更改)。如果可能,请提供建议,如果不是,可能有一些解决方法(示例将非常有帮助)?
我试图了解是否可以通过 3-rd 方 COM 服务将自定义数据从我的生产者传递给我的消费者。可能我需要创建自己的接口,其中包含我的方法并继承 3-rd 方 ISomething 并使用它?
下面是说明问题的代码。非常感谢您的帮助...
1)我用来将数据从生产者传递给消费者的类(通过第 3 方 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)我的数据生产者填充数据并将其传递给第 3 方 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;
}
}