Разница между BSTR и LPCOLESTR заключается в том, что BSTR имеет длину строки с префиксом перед строкой, а LPCOLESTR - нет.
BSTR не обязательно должен иметь окончание \ 0, обозначающее конец строки, так как длина строки имеет префикс, для преобразования я обычно использую класс CComBSTR (atlcomcli.h), а ctor принимает либо BSTR, либо LPCOLESTR как аргумент и есть член BSTR (), чтобы получить представление BSTR:
CComBSTR b( yourolestring )
// b.BSTR()
CComBSTR будет обрабатывать распределение / освобождение, поэтому нет риска утечки памяти.