没有USES_CONVERSION宏

Ton*_*ion 5 c++ macros atl

我有这个代码在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;
}
}
Run Code Online (Sandbox Code Playgroud)

ree*_*ece 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; }