不能转换参数1来自&#39; ATL :: CStringT <wchar_t,atl :: strtraitatl <wchar_t,atl :: chtraitscrt <wchar_t>&gt;&gt;&#39; to&#39; const char *&#39; </wchar_t,atl :: strtraitatl <wchar_t,atl :: chtraitscrt <wchar_t>

时间:2014-04-07 15:21:27

标签: c++ mfc atl cstring

如何正确转换?

    VARIANT varIndex;
    CString csIndex;
    //Index BSTR
    csIndex = (LPCSTR)(_bstr_t)vtIndex;
    csIndex.MakeUpper();
    if (csIndex.Left(3) == PROCESSUS_TABLE)
    {
        lIndex = atoi((LPCSTR)csIndex.Mid(3));
        if ((unsigned long)lIndex<0)
            return E_INVALIDARG;
    }

错误讯息:

C2664: 'int atoi(const char *)' : cannot convert argument 1 from 'ATL::CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>' to 'const char *'

我无法找到解决这个问题的方法,好吗?

2 个答案:

答案 0 :(得分:1)

CComVariant::ChangeType通过.bstrVal成员,_ttoi而不是atoi向您提供:

VARIANT vtIndex;
// ...
CComVariant vStringIndex;
HRESULT nResult = vStringIndex.ChangeType(VT_BSTR, &vtIndex);
if(FAILED(nResult))
  ; // TODO: Handle error
CString csIndex(vStringIndex.bstrVal);
csIndex.MakeUpper();
if (csIndex.Left(3) == PROCESSUS_TABLE)
{
    lIndex = _ttoi(csIndex.Mid(3));
    // ...

答案 1 :(得分:1)

变量&#csIndex&#39;是一个unicoce字符串(wchar_t),而宏LPCSTR是ansi字符串(char)。

所以你应该使用Unicode函数,代码将是:

lIndex = _wtoi((LPCWSTR)csIndex.Mid(3));

这一行没有问题:

csIndex = (LPCSTR)(_bstr_t)vtIndex;

这是因为智能指针类型_bstr_t可以自动处理char * / wchar_t *转换。