Существуют основанные на классах ATL :: CA2W и друзья (в atlconv.h, я полагаю), которые не помещают строку в стек и не используют макросы.Вам не нужен USES_CONVERSION в функции:
throw x::internal_error(ATL::CA2W(pszErrStr));
Кроме того, поскольку ваши аргументы являются BSTR (wchar_t *), вам не нужно преобразовывать их в _bstr_t.
ПРИМЕЧАНИЕ. Время жизни преобразованной строки - это время жизни объекта CW2A, поэтому вам нужно будет поместить его в класс строки, например:
CStringA arg = CW2A(bstrArg);
ПРИМЕЧАНИЕ 2: pbstrValue является выходным значением.Экземпляр _bstr_t уничтожит память, выделенную для BSTR.Поэтому вам нужно либо использовать SysAllocString напрямую, либо отсоединить BSTR:
pbstrValue = SysAllocString(CA2W(retval));
или:
pbstrValue = CComBSTR(CA2W(retval)).Detach();
ПРИМЕЧАНИЕ 3:Явное использование операторов преобразования (.operator BSTR()
) не требуется - компилятор вызовет правильный для вас.
ПРИМЕЧАНИЕ 4. Поскольку это похоже на вызов COM, вы действительно не хотите, чтобыбросая исключение C ++.Вы, вероятно, хотите установить объект IErrorInfo (возможно, с помощником):
if (!bResult) { SetError(CA2W(errorStr)); return E_FAIL; }