Ваша проблема (кроме возможности копирования памяти внутри _bstr_t) заключается в том, что вы конвертируете UNICODE BSTR в символ ANSI *.
Вы можете использовать макросы USES_CONVERSION, которые выполняют преобразование в стеке, поэтому они могут быть быстрее. В качестве альтернативы, если возможно, сохраните значение BSTR в Юникоде.
конвертировать:
USES_CONVERSION;
char* p = strdup(OLE2A(var.bstrVal));
// ...
free(p);
запомните - строка, возвращаемая из OLE2A (и его сестринских макросов), возвращает строку, выделенную в стеке, - возвращайтесь из окружающей области видимости, и у вас есть строка мусора, если вы не скопируете ее (и, в конце концов, освободите ее, очевидно) * *