std::строка в LPOLESTR

#c #string #com #ole

#c #строка #com #ole

Вопрос:

У меня есть массив строк, подобных этому:

 using std::string;
string myArray[] = { string("abc"), string("foo"), string("muh") };
  

Теперь я хочу использовать эту функцию:

 HRESULT Init(T* begin, T* end, IUnknown* pUnk, CComEnumFlags flags = AtlFlagNoCopy );
  

В моем случае это LPOLESTR. Итак, мне нужно преобразовать массив std::string в LPOLESTR, соответственно, мне нужен LPOLESTR* для начала и конца этого массива. Как это делается?

Спасибо заранее

Ответ №1:

ATL имеет набор макросов для преобразования строк. В вашем случае вы можете использовать:

 LPOLESTR olestr = A2OLE(std_str.c_str());
  

Обратите внимание, что OLESTR — это в основном wchar_t * , поэтому, если вы используете std::wstring (или строковые литералы с широкими символами), вам даже не нужен макрос:

 LPOLESTR olestr = std_wstr.c_str();
  

Комментарии:

1. Я знаю, что это старый пост, но я также пытаюсь преобразовать std::string в LPOLESTR, и когда я пробую этот код, я получаю «идентификатор _lpa не определен». Я включил atlbase.h и atlconv.h. Также в документе, который вы связали, из того, что я могу сказать, похоже, что A2OLE предназначен для преобразования LPSTR в LPOLESTR (именно поэтому мы используем c_str?). Я совершенно новичок в c , поэтому извините, если я упускаю что-то очевидное, буду признателен за любую помощь, спасибо.

2. @rhowell — я не касался COM-материалов примерно с того времени, как написал свой ответ, поэтому, возможно, тоже чего-то не хватает. _lpa Ошибка может быть устранена путем добавления USES_CONVERSION макроса перед использованием макросов преобразования (yuk!). В общем, эти макросы преобразуют между широкими символами и обычными символами. Типы строк ATL зависят от сборки (Unicode / ascii), поэтому преобразование в / из обычных типов C / C (которые не зависят от сборки) также должно зависеть от сборки. Используется c_str() для отправки необработанной строки C, а именно указателя на массив символов, поскольку макросы не предназначены для объектов C std::string .

3. eran означает поместить эту строку USES_CONVERSION; внутри функции перед любым вызовом преобразования. Я неправильно понял его значение для первого взгляда и в конечном итоге работал с ним