BSTR

BSTRは、表面上ワイド文字だが、文字列本体の前には文字列のバイト数、文字列本体の後には2バイトのNULL終端があるので、全く同じに扱うことはできない。

SysAllocString function (oleauto.h) - Win32 apps | Microsoft Docs
BSTR 用のメモリの割り当てと解放 | Microsoft Docs
BSTR とは? - Windows 徹底解説 - Web/DB プログラミング徹底解説

バイト数や2バイトNULL終端があるかを確認する。
BSTR.cppで、

str - 2は、BSTR分2つ前だから4バイト前を指す。
str[5]は、最後の要素からBSTR1つ後だから2バイト後を指す。

ABCDE
str[-1] = 10
str[0] = 0x00000041
str[1] = 0x00000042
str[2] = 0x00000043
str[3] = 0x00000044
str[4] = 0x00000045
str[5] = 0x00000000
続行するには何かキーを押してください . . .

"ABCDE"は5文字なので10バイト。
確かに手前に10が入ってる。
後ろもNULL終端されてる。

Sample/com/BSTR/BSTR/src/BSTR at master · bg1bgst333/Sample · GitHub