从 COM 返回结构
Returning a struct from COM
我正在 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;
我的实现 return 在某些时候是这个结构:
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()
returns 一个 char *
已填充,例如 Error trying to connect.
.这是为什么?我要return一个结构。我是否必须从调用端或从 COM 对象端以某种特殊方式分配它?有人可以举例说明如何做到这一点吗?
没有完整的示例,很难确切地知道您要做什么。但是看起来你可能想写下面的内容
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 无关。
我正在 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;
我的实现 return 在某些时候是这个结构:
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()
returns 一个 char *
已填充,例如 Error trying to connect.
.这是为什么?我要return一个结构。我是否必须从调用端或从 COM 对象端以某种特殊方式分配它?有人可以举例说明如何做到这一点吗?
没有完整的示例,很难确切地知道您要做什么。但是看起来你可能想写下面的内容
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 无关。