通过预定义的COM接口传递自定义数据

时间:2012-06-08 21:01:55

标签: com interface reinterpret-cast

我正在使用第三方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;
    }
}

1 个答案:

答案 0 :(得分:0)

你尝试做的事情是不可能的。但是,如果您可以声明自己的新界面,那么您可以使它工作吗?

在这种情况下,您的对象可以实现ISomething&amp; IMyInterface,你可以定义IMyInterface以获得你想要的任何新方法。