STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Classes | Functions
msclr::interop::details Namespace Reference

Classes

class  char_buffer
 

Functions

_Check_return_ size_t GetAnsiStringSize (System::String^_str)
 
void WriteAnsiString (_Out_writes_all_(_size) _Post_z_ char *_buf, size_t _size, System::String^_str)
 
_Check_return_ size_t GetUnicodeStringSize (_In_reads_z_(_count+1) const char *_str, size_t _count)
 
void WriteUnicodeString (_Out_writes_all_(_size) _Post_z_ wchar_t *_dest, size_t _size, _In_reads_bytes_(_count) const char *_src, size_t _count)
 
System::String InternalAnsiToStringHelper (_In_reads_z_(_count+1) const char *_src, size_t _count)
 
System::String InternalUnicodeToStringHelper (_In_reads_z_(_count+1) const wchar_t *_src, size_t _count)
 

Function Documentation

_Check_return_ size_t msclr::interop::details::GetAnsiStringSize ( System::String^  _str)
inline
82  {
83  size_t _size = 0;
84  cli::pin_ptr<const wchar_t> _pinned_ptr = PtrToStringChars(_str);
85 
86  _size = ::WideCharToMultiByte(CP_THREAD_ACP, WC_NO_BEST_FIT_CHARS, _pinned_ptr, _str->Length, NULL, 0, NULL,NULL);
87  if (_size == 0 && _str->Length != 0)
88  {
89  throw gcnew System::ArgumentException(_EXCEPTION_WC2MB);
90  }
91  // adding 1 for terminating nul
92  _size+=1;
93  return _size;
94  }
#define _EXCEPTION_WC2MB
Definition: marshal.h:44
__const_Char_ptr PtrToStringChars(__const_String_handle s)
Definition: vcclr.h:40
#define NULL
Definition: corecrt.h:158
_Check_return_ size_t msclr::interop::details::GetUnicodeStringSize ( _In_reads_z_(_count+1) const char _str,
size_t  _count 
)
inline
116  {
117  size_t _size = 0;
118  if (_count > INT_MAX)
119  {
120  throw gcnew System::ArgumentOutOfRangeException(_EXCEPTION_GREATER_THAN_INT_MAX);
121  }
122  _size = ::MultiByteToWideChar(CP_THREAD_ACP, 0, _str, static_cast<int>(_count), NULL, 0);
123 
124  if (_size == 0 && _count != 0)
125  {
126  throw gcnew System::ArgumentException(_EXCEPTION_MB2WC);
127  }
128  //adding 1 for terminating nul
129  _size+=1;
130  return _size;
131  }
#define _EXCEPTION_GREATER_THAN_INT_MAX
Definition: marshal.h:41
#define _EXCEPTION_MB2WC
Definition: marshal.h:43
#define INT_MAX
Definition: limits.h:35
#define NULL
Definition: corecrt.h:158
System::String msclr::interop::details::InternalAnsiToStringHelper ( _In_reads_z_(_count+1) const char _src,
size_t  _count 
)
inline
151  {
152  size_t _size = details::GetUnicodeStringSize(_src, _count);
153  if (_size > INT_MAX || _size <=0 )
154  {
155  throw gcnew System::ArgumentOutOfRangeException(_EXCEPTION_GREATER_THAN_INT_MAX);
156  }
157  details::char_buffer<wchar_t> _wchar_buf(_size);
158  if (_wchar_buf.get() == NULL)
159  {
160  throw gcnew System::InsufficientMemoryException();
161  }
162 
163  details::WriteUnicodeString(_wchar_buf.get(), _size, _src, _count);
164 
165  return gcnew System::String(_wchar_buf.get(), 0, static_cast<int>(_size)-1);
166  }
#define _EXCEPTION_GREATER_THAN_INT_MAX
Definition: marshal.h:41
_Check_return_ size_t GetUnicodeStringSize(_In_reads_z_(_count+1) const char *_str, size_t _count)
Definition: marshal.h:115
void WriteUnicodeString(_Out_writes_all_(_size) _Post_z_ wchar_t *_dest, size_t _size, _In_reads_bytes_(_count) const char *_src, size_t _count)
Definition: marshal.h:133
#define INT_MAX
Definition: limits.h:35
#define NULL
Definition: corecrt.h:158
System::String msclr::interop::details::InternalUnicodeToStringHelper ( _In_reads_z_(_count+1) const wchar_t _src,
size_t  _count 
)
inline
169  {
170  if (_count > INT_MAX)
171  {
172  throw gcnew System::ArgumentOutOfRangeException(_EXCEPTION_GREATER_THAN_INT_MAX);
173  }
174 
175  return gcnew System::String(_src, 0 ,static_cast<int>(_count));
176  }
#define _EXCEPTION_GREATER_THAN_INT_MAX
Definition: marshal.h:41
#define INT_MAX
Definition: limits.h:35
void msclr::interop::details::WriteAnsiString ( _Out_writes_all_(_size) _Post_z_ char _buf,
size_t  _size,
System::String^  _str 
)
inline
97  {
98  cli::pin_ptr<const wchar_t> _pinned_ptr = PtrToStringChars(_str);
99 
100  //checking for overflow
101  if (_size > INT_MAX)
102  {
103  // this should never happen if _size was returned by GetAnsiStringSize()
104  throw gcnew System::ArgumentOutOfRangeException(_EXCEPTION_GREATER_THAN_INT_MAX);
105  }
106  size_t _written = ::WideCharToMultiByte(CP_THREAD_ACP, WC_NO_BEST_FIT_CHARS, _pinned_ptr, _str->Length, _buf, static_cast<int>(_size) ,NULL,NULL);
107  if( _written >= _size ||
108  (_written == 0 && _size != 1)) // allowing empty string
109  {
110  throw gcnew System::ArgumentException(_EXCEPTION_WC2MB);
111  }
112  _buf[_written] = '\0';
113  }
#define _EXCEPTION_GREATER_THAN_INT_MAX
Definition: marshal.h:41
#define _EXCEPTION_WC2MB
Definition: marshal.h:44
__const_Char_ptr PtrToStringChars(__const_String_handle s)
Definition: vcclr.h:40
#define INT_MAX
Definition: limits.h:35
#define NULL
Definition: corecrt.h:158
void msclr::interop::details::WriteUnicodeString ( _Out_writes_all_(_size) _Post_z_ wchar_t _dest,
size_t  _size,
_In_reads_bytes_(_count) const char _src,
size_t  _count 
)
inline
134  {
135  //checking for overflow
136  if (_size > INT_MAX || _count > INT_MAX)
137  {
138  throw gcnew System::ArgumentOutOfRangeException(_EXCEPTION_GREATER_THAN_INT_MAX);
139  }
140 
141  size_t _written = ::MultiByteToWideChar(CP_THREAD_ACP, 0, _src, static_cast<int>(_count), _dest, static_cast<int>(_size));
142  if( _written >= _size ||
143  (_written == 0 && _size != 1)) // allowing empty string
144  {
145  throw gcnew System::ArgumentException(_EXCEPTION_MB2WC);
146  }
147  _dest[_written] = L'\0';
148  }
#define _EXCEPTION_GREATER_THAN_INT_MAX
Definition: marshal.h:41
#define _EXCEPTION_MB2WC
Definition: marshal.h:43
#define INT_MAX
Definition: limits.h:35