Есть ActiveX на Atl. вопрос возник, как по ПРАВИЛЬНО получать в CString свойства из ActiveX.
CComBSTR sbsOut;
CString tmpStr;
pcx->get_myprop(&sbsOut); ИЛИ pcx->get_myprop(&sbsOut.m_str);
tmpStr=W2T(sbsOut); ИЛИ tmpStr.Format("%S",sbsOut.m_str);
и надо ли затем что-то делать с sbsOut, освобождать память там?
Здравствуйте, Mr., Вы писали:
Mr.>Есть ActiveX на Atl. вопрос возник, как по ПРАВИЛЬНО получать в CString свойства из ActiveX.
Mr.>Mr.>CComBSTR sbsOut;
Mr.>CString tmpStr;
pcx->>get_myprop(&sbsOut); ИЛИ pcx->get_myprop(&sbsOut.m_str);
Mr.>tmpStr=W2T(sbsOut); ИЛИ tmpStr.Format("%S",sbsOut.m_str);
Mr.>
Mr.>и надо ли затем что-то делать с sbsOut, освобождать память там?
Скорее всего должно быть что-то вроде
BSTR bstrOut = NULL;
CString tmpStr;
pcx->get_myprop(&bstrOut );
tmpStr = bstrOut ; //У CString есть соответствующий оператор присваивания
::SysFreeString(bstrOut);
Прошу прощения, но нет компилятора под рукой, поэтому синтаксис не проверял
CComBSTR sbsOut;
CString tmpStr;
pcx->get_myprop(&sbsOut); // Всё OK
pcx->get_myprop(&sbsOut.m_str); // в данном случае будет работать, но это во-1 -
// чуть больше текста, во-2 - если в CComBSTR уже что-то
// было то ты получишь утечку без всяких ASSERT-ов.
// Посмотри на CComBSTR::operator& чтобы стало понятнее
tmpStr=W2T(sbsOut); // всё OK
tmpStr.Format("%S",sbsOut.m_str); // тоже всё OK, но это просто лишняя работа.
// Память деструкторы CComBSTR и CString освободят сами.
А вообще — use the source, Luke! — чтение сорцов CComBSTR и CString доставят тебе много увлекательных минут и дадут твёрдое понимание что и где происходит — строки в программах используются повсеместно, так что глубокие знания в этой области окупятся сторицей

... << RSDN@Home 1.2.0 alpha rev. 717>>