1. 程式人生 > >寬字元與窄字元的轉換

寬字元與窄字元的轉換

class CW2AEX { public: CW2AEX(_In_z_ LPCWSTR psz) throw(...) : m_psz( m_szBuffer ) { Init( psz, _AtlGetConversionACP() ); } CW2AEX( _In_z_ LPCWSTR psz, _In_ UINT nCodePage) throw(...) : m_psz( m_szBuffer ) { Init( psz, nCodePage
)
; } ~CW2AEX() throw() { AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength); } _Ret_z_ operator LPSTR() const throw() { return( m_psz ); } private: void Init( _In_z_ 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(_In_ const CW2AEX&) throw(); CW2AEX& operator=(_In_ const CW2AEX&) throw(); }; typedef CW2AEX<> CW2A;