我有这个代码在C ++项目中使用USE_CONVERSION宏...
我想知道这是否写得好,(不是我写的),如果还有更好的方法,没有USES_CONVERSION和W2A宏。
STDMETHODIMP CInterpreter::GetStringVar(BSTR bstrNamespace, BSTR bstrVar, BSTR *pbstrValue)
{
USES_CONVERSION;
try
{
if (!pbstrValue) return E_POINTER;
char* pszNamespace= W2A(_bstr_t(bstrNamespace).operator wchar_t*());
char* pszVar= W2A(_bstr_t(bstrVar).operator wchar_t*()); // Is this not better done another way????
char pszErrStr[kPYTHONERRBUFSIZE];
char pszStrValue[kPYTHONSTRVALUESIZE];
BOOL bResult= Python_GetStringVar(pszNamespace, pszVar, pszErrStr, pszStrValue, kPYTHONSTRVALUESIZE);
*pbstrValue= _bstr_t(pszStrValue).operator BSTR();
if (!bResult)
throw x::internal_error(A2W(pszErrStr));
return S_OK;
}
}
答案 0 :(得分:6)
有基于类的ATL :: CA2W和朋友(在atlconv.h中,我相信)不会将字符串放在堆栈上而不使用宏。您在函数中不需要USES_CONVERSION:
throw x::internal_error(ATL::CA2W(pszErrStr));
此外,由于您的参数是BSTR(wchar_t *),因此您无需将它们转换为_bstr_t。
注意:转换后的字符串的生命周期是CW2A对象的生命周期,因此您需要将其放入字符串类中,例如:
CStringA arg = CW2A(bstrArg);
注2:pbstrValue是输出值。 _bstr_t实例将破坏为BSTR分配的内存。因此,您需要直接使用SysAllocString,或者分离BSTR:
pbstrValue = SysAllocString(CA2W(retval));
或:
pbstrValue = CComBSTR(CA2W(retval)).Detach();
注3:不需要明确使用转换运算符(.operator BSTR()
) - 编译器会为您调用正确的算法。
注4:由于这看起来像是COM调用,所以你真的不想抛出C ++异常。您可能想要设置IErrorInfo对象(可能带有帮助程序):
if (!bResult) { SetError(CA2W(errorStr)); return E_FAIL; }