Visual c++ 从COM返回结构

Visual c++ 从COM返回结构,visual-c++,struct,com,atl,idl,Visual C++,Struct,Com,Atl,Idl,我正在VisualStudio中处理一个ATL项目,该项目公开了一个定义结构的COM对象 我的*.idl中定义了以下COM方法: [id(2)] HRESULT CheckOut([in] CHAR* feature, [in] CHAR* version, [out] CerberusCheckoutDetails* details, [out] CerberusErrorDetails* error); My*.idl定义了此结构: [ uuid(527568A1-36A8-467

我正在VisualStudio中处理一个ATL项目,该项目公开了一个定义结构的COM对象

我的
*.idl
中定义了以下COM方法:

[id(2)] HRESULT CheckOut([in] CHAR* feature, [in] CHAR* version, [out] CerberusCheckoutDetails* details, [out] CerberusErrorDetails* error);
My
*.idl
定义了此结构:

[
    uuid(527568A1-36A8-467A-82F5-228F7C3AC926),
    version(1.0)
]
typedef struct CerberusErrorDetails {
    INT ErrorCode;
    BSTR ErrorMessage;
} CerberusErrorDetails;
我的实现在某个时刻返回此结构:

int result = checkout(feature, version, 1, 0, remoteServerName);
if (result != 0)
{
    error = new CerberusErrorDetails();
    error->ErrorCode = result;
    error->ErrorMessage = _bstr_t(errstring()).Detach();
    return result;
}
我这样称呼它:

CerberusNativeLib::CerberusErrorDetails *error = new CerberusNativeLib::CerberusErrorDetails();
if (session->CheckOut(feature, version, details, error) != S_OK)
            std::wcout << error->ErrorCode << ": " << error->ErrorMessage << std::endl;
CerberUsnaviElib::CerberusErrorDetails*错误=new CerberUsnaviElib::CerberusErrorDetails();
if(会话->签出(功能、版本、详细信息、错误)!=S\u确定)

std::wcout ErrorCode ErrorMessage
始终为
NULL
,但它应该包含实际的错误消息,因为
errstring()
返回一个已填充的
char*
,例如
尝试连接时出错。
。为什么呢?我想返回一个结构。我必须以某种特殊的方式从调用端或COM对象端分配它吗?有人能提供一个例子来说明如何做到这一点吗?

没有完整的例子,很难确切地知道你想做什么。但是看起来你可能想写以下内容

CerberusNativeLib::CerberusErrorDetails error;
if (session->CheckOut(feature, version, details, &error) != S_OK)
(无
new
,传递堆栈上的
struct
地址)和


(同样,没有新代码)。请注意,这与COM没有多大关系。

如果没有完整的示例,很难确切知道您要做什么。但是看起来你可能想写以下内容

CerberusNativeLib::CerberusErrorDetails error;
if (session->CheckOut(feature, version, details, &error) != S_OK)
(无
new
,传递堆栈上的
struct
地址)和

(同样,没有新代码)。请注意,这与COM没有什么关系