BSTR
не совпадает с WCHAR[]
. BSTR
значения начинаются с их длины, а также заканчиваются нулем.
Если вы имеете дело с внутрипроцессными объектами, написанными на C или C ++, вам обычно это сойдет с рук, потому что код C / C ++, вероятно, будет предполагать, что ваш BSTR является строкой широких символов с нулевым символом в конце .
Если, с другой стороны, вы имеете дело с внепроцессными / кросс-машинными объектами, код прокси / заглушки будет предполагать, что вы действительно передали BSTR, и будет ожидать, что найдет поле длины (это нужно, чтобы знать, сколько данных нужно собрать). Это будет ужасно неправильно.
Вкратце: если что-то ожидает BSTR, вызовите SysAllocString (или CComBSTR, или CString :: AllocSysString).