【发布时间】: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->ErrorCode 是 0 但它应该是 -95 (通过代码,我可以看到 result 是 -95)并且 error->ErrorMessage 始终是 NULL 但它应该包含一个实际的错误消息,因为errstring() 返回一个已填充的char *,例如Error trying to connect.。这是为什么?我想返回一个结构。我是否必须从调用方或 COM 对象方以某种特殊方式分配它?有人可以提供一个如何做到这一点的例子吗?
【问题讨论】:
标签: visual-c++ struct com atl idl