Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;它公开了一个返回对象的函数?_C++_Dll_Com_Idl - Fatal编程技术网

C++ 如何在C++;它公开了一个返回对象的函数?

C++ 如何在C++;它公开了一个返回对象的函数?,c++,dll,com,idl,C++,Dll,Com,Idl,我有一个WCF(C#应用程序)应用程序,它调用C++COM Dll。现在C++所公开的方法具有以下签名。 STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, OUT long *pVal) 现在,我想返回一个具有多个属性的接口,而不是返回一个long*pVal。差不多- STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, OUT IData *pVal)

我有一个WCF(C#应用程序)应用程序,它调用C++COM Dll。现在C++所公开的方法具有以下签名。
STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, OUT long *pVal)
现在,我想返回一个具有多个属性的接口,而不是返回一个long*pVal。差不多-

STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, OUT IData *pVal)

那么对于新接口,我应该如何更新COM DLL?因此,我应该在IDL文件中为IData接口添加一个新条目。对于这个COM+C++ DLL,我是新手。

< p>您需要在IDL中有一个函数(假设您的接口是IMESAGEGETCROL):

或者,如果希望选项返回long或对象

interface IMessageControl
{
   STDMETHOD(CallMe)(eEventType eventTypeVal, [out,retval] VARIANT* pVal);
}
<你的C++代码将是类似的:

STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, IData** pVal)
{
   return E_NOTIMPL;
}
或用于变体版本

STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, VARIANT* pVal)
{
   return E_NOTIMPL;
}

显然,一旦实现,返回S_OK表示正确返回,或返回E_type错误代码表示失败。

如果IData表示接口,则应该在idl中声明它,就像其他接口一样(这样idl编译器可以编译它)。您可以在同一个.idl或另一个.idl中定义它并包含它。@SimonMourier好的,但是您能给我一个示例,比如在idl文件中编写像IData这样的接口的方法是什么,它将有两个属性,比如DriverName和DriverId,并且是字符串类型吗?您有现有的idl吗?属性是dispinterface的概念,而不是interface(其中所有内容都是一个方法):
STDMETHODIMP MessageControl::CallMe(eEventType eventTypeVal, VARIANT* pVal)
{
   return E_NOTIMPL;
}