CString str(_T("zhangSan"));
::RegSetValueEx(hKey,NULL,0,REG_SZ,CT2CA(str),30);
RegCloseKey(hKey);error C2955: 'ATL::CW2AEX' : error C2664: 'RegSetValueExW' : cannot convert parameter 5 from 'ATL::CW2AEX<>' to 'const BYTE *'环境VS2005、XP、SP3

解决方案 »

  1.   

    unsigned和signed就在一念之间reinterpret_cast<const BYTE*>(CT2CA((LPCTSTR)str))不知可否?
      

  2.   

    不行~
    error C2440: 'reinterpret_cast' : cannot convert from 'ATL::CW2AEX<>' to 'const BYTE *'
      

  3.   

    上机看了下,可以这样:
    (const BYTE*)(LPCSTR)CT2CA(str)
      

  4.   

    这样的话,要这个宏CT2CA就没意义了吧。直接(const BYTE*)(LPCSTR)str就行了吧
      

  5.   

    (LPCSTR)str在unicode下能够编译通? LPCTSTR吧?如果可以用CStringA,看你就用Format主要用到CW2AEX类,CT2CA是其unicode下的宏入口
    里面还是很复杂的,在vc目录下altmfc下面有源代码,我找了一下:template< int t_nBufferLength = 128 >
    class CW2AEX
    {
    public:
    CW2AEX( __in_opt LPCWSTR psz ) throw(...) :
    m_psz( m_szBuffer )
    {
    Init( psz, _AtlGetConversionACP() );
    }
    CW2AEX( __in_opt LPCWSTR psz, UINT nCodePage ) throw(...) :
    m_psz( m_szBuffer )
    {
    Init( psz, nCodePage );
    }
    ~CW2AEX() throw()
    {
    AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
    } operator LPSTR() const throw()
    {
    return( m_psz );
    }private:
    void Init( __in_opt LPCWSTR psz, __in UINT nConvertCodePage ) throw(...)
    {
    if (psz == NULL)
    {
    m_psz = NULL;
    return;
    }
    int nLengthW = lstrlenW( psz )+1;  
    int nLengthA = nLengthW*4;

    AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength); BOOL bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, NULL, NULL ));
    if (bFailed)
    {
    if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
    {
    nLengthA = ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, NULL, 0, NULL, NULL );
    AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);
    bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, NULL, NULL ));
    }
    }
    if (bFailed)
    {
    AtlThrowLastWin32();
    }
    }public:
    LPSTR m_psz;
    char m_szBuffer[t_nBufferLength];private:
    CW2AEX( const CW2AEX& ) throw();
    CW2AEX& operator=( const CW2AEX& ) throw();
    };typedef CW2AEX<> CW2A;#ifdef _UNICODE #define CW2T CW2W
    #define CW2TEX CW2WEX
    #define CW2CT CW2CW
    #define CW2CTEX CW2CWEX
    #define CT2W CW2W
    #define CT2WEX CW2WEX
    #define CT2CW CW2CW
    #define CT2CWEX CW2CWEX #define CA2T CA2W
    #define CA2TEX CA2WEX
    #define CA2CT CA2W
    #define CA2CTEX CA2WEX
    #define CT2A CW2A
    #define CT2AEX CW2AEX
    #define CT2CA CW2A
    #define CT2CAEX CW2AEX#else  // !_UNICODE #define CW2T CW2A
    #define CW2TEX CW2AEX
    #define CW2CT CW2A
    #define CW2CTEX CW2AEX
    #define CT2W CA2W
    #define CT2WEX CA2WEX
    #define CT2CW CA2W
    #define CT2CWEX CA2WEX #define CA2T CA2A
    #define CA2TEX CA2AEX
    #define CA2CT CA2CA
    #define CA2CTEX CA2CAEX
    #define CT2A CA2A
    #define CT2AEX CA2AEX
    #define CT2CA CA2CA
    #define CT2CAEX CA2CAEX#endif  // !_UNICODE