#include <comdef.h><br><br>#ifndef _CONV_H<br>#define _CONV_H<br><br><br><br>class toBSTR <br>{<br><br>public:<br><br> // Foreign constructors<br> toBSTR (const char *p8);<br> toBSTR (const wchar_t *p16);<br><br> // Native Constructor<br> toBSTR (const BSTR bstr);<br><br> // Non-virtual destructor (this class is concrete)<br> ~toBSTR (void);<br><br> // Native conversion operator<br> operator const BSTR (void) const;<br><br>private:<br><br> // Native BSTR string<br> BSTR m_bstr;<br><br> // Is foreign?<br> BOOL m_bIsForeign;<br><br> // Protect against assignment: just declare the prototypes of the copy <br> // constructor and assignment operator, and DO NOT implement them<br> toBSTR (const toBSTR&);<br> toBSTR& operator= (const toBSTR&);<br><br>};<br><br><br>// Foreign constructors require allocation of a native<br>// string and conversion<br>inline toBSTR::toBSTR (const char *p8)<br>: m_bstr (SysAllocStringLen (0, strlen (p8))), m_bIsForeign (TRUE) <br> // SysAllocStringLen appends a NULL characther <br>{<br> // If the 1st arg. is NULL, mbstowcs() returns the required size<br> // of the destination string.<br> size_t size = mbstowcs (0, p8, strlen (p8)) + 1;<br> mbstowcs (m_bstr, p8, size);<br>}<br><br>inline toBSTR::toBSTR (const wchar_t *p16) <br>: m_bstr (SysAllocString(p16)), m_bIsForeign (TRUE) <br>{ <br>}<br><br><br>// Native constructor is a pass-through.<br>inline toBSTR::toBSTR (const BSTR bstr) <br>: m_bstr (bstr), m_bIsForeign (FALSE) <br>{ <br>}<br><br>// Simply give out the native wideness string. <br>inline toBSTR:

perator const BSTR (void) const <br>{<br> return m_bstr;<br>}<br><br><br>// Destructor: Delete native string only if synthesized <br>// in foreign constructor.<br>inline toBSTR::~toBSTR (void)<br>{<br> if (m_bIsForeign)<br> {<br> SysFreeString(m_bstr);<br> }<br>}<br><br><br>class toCStringW <br>{<br><br>public:<br><br> // Native constructor<br> toCStringW (const wchar_t *p16);<br><br> // Foreign constructors<br> toCStringW (const char *p8);<br> toCStringW (const BSTR bstr);<br><br> // Non-virtual destructor (this class is concrete)<br> ~toCStringW (void);<br><br> // Native conversion operator<br> operator const wchar_t * (void) const;<br><br>private:<br><br> // Native wideness string: wchar_t*<br> wchar_t *m_sz;<br><br> // Is foreign?<br> BOOL m_bIsForeign;<br><br> // Protect against assignment<br> toCStringW (const toCStringW&);<br> toCStringW& operator= (const toCStringW&);<br>};<br><br><br>// Native constructor is a pass-through<br>inline toCStringW::toCStringW (const wchar_t *p16) <br>: m_sz ((wchar_t *)p16), m_bIsForeign (FALSE) <br>{ <br>}<br><br><br>// Foreign constructors require allocation of a native<br>// string and conversion<br>inline toCStringW::toCStringW (const char *p8)<br>: m_bIsForeign (TRUE) <br>{<br> // Calculate required buffer size (some characters may<br> // already occupy 16-bits under DBCS)<br> size_t size = mbstowcs (0, p8, strlen(p8)) + 1;<br><br> // Alloc native string and convert<br> if (m_sz = new wchar_t[size])<br> {<br> mbstowcs (m_sz, p8, size);<br> }<br>}<br><br><br>inline toCStringW::toCStringW (const BSTR bstr)<br>: m_bIsForeign (TRUE) <br>{<br> // Calculate required buffer size<br> size_t size = wcstombs (0, bstr, wcslen (bstr)) + 1;<br><br> // Alloc native string and convert<br> if (m_sz = new wchar_t[size])<br> {<br> m_sz = bstr;<br> }<br>}<br><br><br><br>// Simply give out the native wideness string <br>inline toCStringW:

perator const wchar_t * (void) const <br>{<br> return m_sz;<br>}<br><br>// Delete w_char* string only if synthesized in foreign constructor<br>inline toCStringW::~toCStringW (void)<br>{<br> if (m_bIsForeign)<br> {<br> delete[] m_sz;<br> }<br>}<br><br><br>class toCString <br>{<br><br>public:<br><br> // Native constructor<br> toCString (const char *p8);<br><br> // Foreign constructors<br> toCString (const wchar_t *p16);<br> toCString (const BSTR bstr);<br><br> // Non-virtual destructor <br> ~toCString (void);<br><br> // Native conversion operator<br> operator const char * (void) const;<br><br>private:<br><br> // Native wideness string: char*<br> char *m_sz;<br><br> // Is foreign?<br> BOOL m_bIsForeign;<br><br><br> // Protect against assignment<br> toCString (const toCString&);<br> toCString& operator= (const toCString&);<br>};<br><br><br>// Native constructor is a pass-through<br>inline toCString::toCString (const char *p8) <br>: m_sz ((char*)p8), m_bIsForeign (FALSE) <br>{ <br>}<br><br><br>// Foreign constructor requires allocation of a native<br>// string and conversion<br>inline toCString::toCString (const wchar_t *p16)<br>: m_bIsForeign(TRUE) <br>{<br><br> // Calculate required buffer size (some characters may<br> // require more than one byte under DBCS)<br> size_t size = wcstombs (0, p16, wcslen (p16)) + 1;<br><br> // Alloc native string and convert<br> if (m_sz = new char[size])<br> {<br> wcstombs (m_sz, p16, size);<br> }<br>}<br><br><br><br>// Simply give out the native wideness string <br>inline toCString:

perator const char * (void) const <br>{<br> return m_sz;<br>}<br><br><br>// Delete native string only if synthesized in foreign constructor<br>inline toCString::~toCString (void) <br>{<br> if (m_bIsForeign) <br> {<br> delete[] m_sz;<br> }<br>}<br><br><br>#endif // _CONV_H<br>