首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用USES_CONVERSION宏

不使用USES_CONVERSION宏
EN

Stack Overflow用户
提问于 2010-06-22 15:44:08
回答 1查看 7.7K关注 0票数 6

我有一个在C++项目中使用USE_CONVERSION宏的代码...

我想知道这是不是写得很好(不是我写的),如果没有USES_CONVERSION和W2A宏,有没有更好的方法来做到这一点。

代码语言:javascript
复制
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;
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-22 15:57:42

有一些基于类的ATL::CA2W和朋友(我相信是在atlconv.h中)不会将字符串放在堆栈中,也不会使用宏。您不需要在函数中使用USES_CONVERSION

throw x::internal_error(ATL::CA2W(pszErrStr));

而且,由于您的参数是BSTR (wchar_t *),所以不需要将它们转换为_bstr_t

注意:转换后的字符串的生存期就是CW2A对象的生存期,因此您需要将其放入一个string类中,例如:

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; }

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3091185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档