从COM返回结构

时间:2017-03-27 14:38:06

标签: visual-c++ struct com atl idl

我正在Visual Studio中开发一个ATL项目,该项目公开了一个定义结构的COM对象。

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

[id(2)] HRESULT CheckOut([in] CHAR* feature, [in] CHAR* version, [out] CerberusCheckoutDetails* details, [out] CerberusErrorDetails* error);

我的*.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;

我的问题是error->ErrorCode0但它应该是-95(通过代码,我可以看到result-95)和error->ErrorMessage始终为NULL,但它应包含实际的错误消息,因为errstring()会返回填充的char *,例如Error trying to connect.。这是为什么?我想要归还一个结构。我是否必须以某种特殊方式从调用端或COM对象端分配它?有人可以提供一个如何做到这一点的例子吗?

1 个答案:

答案 0 :(得分:2)

如果没有完整的示例,很难确切地知道正是您正在尝试做什么。但似乎您可能想要编写以下内容

CerberusNativeLib::CerberusErrorDetails error;
if (session->CheckOut(feature, version, details, &error) != S_OK)

(没有new,堆栈上struct的地址已通过)和

int result = checkout(feature, version, 1, 0, remoteServerName);
if (result != 0)
{
    error->ErrorCode = result;
    error->ErrorMessage = _bstr_t(errstring()).Detach();
    return result;
}

(同样,没有new)。请注意,这与COM几乎没有关系。