C++ 在COM C+中传递自定义类+;

C++ 在COM C+中传递自定义类+;,c++,com,C++,Com,如果我正在创建一个COM dll并使用MIDL为COM定义一个接口,我将如何将自定义类的实例传递给该dll中的函数 例如,如果我在IDL中定义了它,我无法传递CustomObject*,那么我如何才能传递CustomObject的实例呢 [ //idl junk ] IMyComService{ [id(1)]HRESULT Foo([in] CustomObject* myObject); //Error } 在此设置中,COM dll具有定义“CustomObject”的头文

如果我正在创建一个COM dll并使用MIDL为COM定义一个接口,我将如何将自定义类的实例传递给该dll中的函数

例如,如果我在IDL中定义了它,我无法传递CustomObject*,那么我如何才能传递CustomObject的实例呢

[
   //idl junk
]
IMyComService{
    [id(1)]HRESULT Foo([in] CustomObject* myObject); //Error
}

在此设置中,COM dll具有定义“CustomObject”的头文件,调用dll的应用程序引用头文件并创建“CustomObject”实例,CustomObject是任意类,其函数和属性不一定仅使用Microsoft类型。

您定义了一个接口,并使您的
CustomObject
实现该接口。你的
Foo
函数接收到一个指向接口的指针。你不能这样做,COM中的实现是非常小心隐藏的,你只能使用接口。您认为必须传递实现引用的原因尚不清楚,实现该接口的任何底层类都应该知道它。@IInspectable即使ICUSTOObject接口没有定义COM对象,这种方法也可以吗?(实现IUnknown等)或者COM dll中的所有类都应该是COM类吗?如果dll为某些事情公开非COM API(例如创建
CustomObject
class的实例),那么为其他事情使用COM有什么意义?混搭是没有意义的——要么一直使用COM,要么根本不使用。一旦你开始将非COM类混搭到你的COM接口中,COM就不再是COM了。除此之外,MIDL不能再生成封送处理代码,您只能实现自己的封送处理程序。通过在COM接口中引入非COM类,您并没有节省任何工作,如果您这样做了,那么您选择COM的原因还不清楚。您定义了一个接口,并让您的
CustomObject
实现该接口。你的
Foo
函数接收到一个指向接口的指针。你不能这样做,COM中的实现是非常小心隐藏的,你只能使用接口。您认为必须传递实现引用的原因尚不清楚,实现该接口的任何底层类都应该知道它。@IInspectable即使ICUSTOObject接口没有定义COM对象,这种方法也可以吗?(实现IUnknown等)或者COM dll中的所有类都应该是COM类吗?如果dll为某些事情公开非COM API(例如创建
CustomObject
class的实例),那么为其他事情使用COM有什么意义?混搭是没有意义的——要么一直使用COM,要么根本不使用。一旦你开始将非COM类混搭到你的COM接口中,COM就不再是COM了。除此之外,MIDL不能再生成封送处理代码,您只能实现自己的封送处理程序。通过在COM接口中引入非COM类,您并没有节省任何工作,如果您这样做了,那么您为什么选择从COM开始并不明显。