#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;
внутри функции перед любым вызовом преобразования. Я неправильно понял его значение для первого взгляда и в конечном итоге работал с ним