【问题标题】:Returning a struct from COM从 COM 返回一个结构
【发布时间】:2017-08-20 08:05:58
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    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 关系不大。

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2012-11-02
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      相关资源
      最近更新 更多