/////////////////////////////////////////////////////////////// // types.cpp - demonstrate COM string conversions // // // // Jim Fawcett, CSE791 - Distributed Objects, Spring 2002 // /////////////////////////////////////////////////////////////// #include #include #include using namespace std; void main() { ///////////////////////////////////////////////////////////////// // you need to use this macro in every function that uses // the ATL macros like W2A USES_CONVERSION; const string prefix = "\n ASCII output: "; const wstring wprefix = L"\n UNICODE output: "; ///////////////////////////////////////////////////////////// // creating BSTR from ASCII CComBSTR bstr1("created from ASCII string"); wcout << wprefix << (wchar_t*)bstr1; ///////////////////////////////////////////////////////////// // creating BSTR from C++ string string s1 = "created from C++ string"; CComBSTR bstr2(s1.c_str()); wcout << wprefix << (wchar_t*)bstr2; ///////////////////////////////////////////////////////////// // creating BSTR from UNICODE string CComBSTR bstr3(L"created from UNICODE string"); wcout << wprefix << (wchar_t*)bstr3; ///////////////////////////////////////////////////////////// // creating wstring from BSTR wstring ws = bstr3; wcout << wprefix << ws; // ///////////////////////////////////////////////////////////// // creating string from BSTR // W2A macro allocates stack memory for conversion string s2 = W2A((wchar_t*)bstr3); cout << prefix << s2; ///////////////////////////////////////////////////////////// // creating ASCII from UNICODE wchar_t *pWstr = (wchar_t*)bstr3; int numChars = wcslen(pWstr); char *buffer = new char[numChars+1]; wcstombs(buffer,pWstr,numChars); buffer[numChars] = '\0'; cout << prefix << buffer; delete [] buffer; ///////////////////////////////////////////////////////////// // creating UNICODE from ASCII wchar_t *wbuffer = new wchar_t[s1.size()+1]; mbstowcs(wbuffer,s1.c_str(),s1.size()); wcout << wprefix << wbuffer; delete [] wbuffer; cout << "\n\n"; }