Какая разница между классами ? Я имею ввиду зачем существует один, если есть другой ? CComPtr и IxxxPtr ? Последний при использовании в клиенте давал interface leak в BoundsChecker. Изменил на CComPtr и лик пропал. Посему и назрел вопрос.
Здравствуйте ligett, Вы писали:
L>Какая разница между классами ? Я имею ввиду зачем существует один, если есть другой ? CComPtr и IxxxPtr ? Последний при использовании в клиенте давал interface leak в BoundsChecker. Изменил на CComPtr и лик пропал. Посему и назрел вопрос.
CComBSTR — часть библиотеки ATL, _bstr_t — часть RTL для поддежки директивы #import. В этом вся разница.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте IT, Вы писали:
IT>Здравствуйте ligett, Вы писали:
L>>Какая разница между классами ? Я имею ввиду зачем существует один, если есть другой ? CComPtr и IxxxPtr ? Последний при использовании в клиенте давал interface leak в BoundsChecker. Изменил на CComPtr и лик пропал. Посему и назрел вопрос.
IT>CComBSTR — часть библиотеки ATL, _bstr_t — часть RTL для поддежки директивы #import. В этом вся разница.
Я думаю, стоит еще отметить, что _bstr_t обладает гораздо большей функциональностью (преобразование в LPCSTR, операторы +, <, += и т.д.). Но "ланчей даром не бывает" — этот класс тянет за собой Runtime Library. Поэтому для разработки компактных ATL-компонентов стоит использовать неприхотливый CComBSTR, а в клиентском коде комфортнее использовать _bstr_t.
Здравствуйте IT, Вы писали:
IT>Здравствуйте ligett, Вы писали:
L>>Какая разница между классами ? Я имею ввиду зачем существует один, если есть другой ? CComPtr и IxxxPtr ? Последний при использовании в клиенте давал interface leak в BoundsChecker. Изменил на CComPtr и лик пропал. Посему и назрел вопрос.
IT>CComBSTR — часть библиотеки ATL, _bstr_t — часть RTL для поддежки директивы #import. В этом вся разница.
Гы, Игорь, ты что еще не проснулся? :)
Человек про CComPtr спрашивал, а не про CComBSTR. Хотя, разница между CComPtr и IxxxPtr та же самая. :)
Здравствуйте Lexey, Вы писали:
L>Гы, Игорь, ты что еще не проснулся? :) L>Человек про CComPtr спрашивал, а не про CComBSTR. Хотя, разница между CComPtr и IxxxPtr та же самая. :)
Дык я эта... иногда и сабжы читаю ;)
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте retalik, Вы писали:
R>Здравствуйте IT, Вы писали:
IT>>Здравствуйте ligett, Вы писали:
L>>>Какая разница между классами ? Я имею ввиду зачем существует один, если есть другой ? CComPtr и IxxxPtr ? Последний при использовании в клиенте давал interface leak в BoundsChecker. Изменил на CComPtr и лик пропал. Посему и назрел вопрос.
IT>>CComBSTR — часть библиотеки ATL, _bstr_t — часть RTL для поддежки директивы #import. В этом вся разница.
R>Я думаю, стоит еще отметить, что _bstr_t обладает гораздо большей функциональностью (преобразование в LPCSTR, операторы +, <, += и т.д.). Но "ланчей даром не бывает" — этот класс тянет за собой Runtime Library. Поэтому для разработки компактных ATL-компонентов стоит использовать неприхотливый CComBSTR, а в клиентском коде комфортнее использовать _bstr_t.
Ага а еще надо отметить, что _bstr_t обладает неописуемой кривизной и жадностью к рисурсам. И главное, что с ним никогда не сделать COM-обект размером <= 5 килобайтам. ;o)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте ligett, Вы писали:
L>Какая разница между классами ? Я имею ввиду зачем существует один, если есть другой ? CComPtr и IxxxPtr ? Последний при использовании в клиенте давал interface leak в BoundsChecker. Изменил на CComPtr и лик пропал. Посему и назрел вопрос.
Ну, лики в баундчекере — это точно твоя заслуга. У нас в проектах все интерфейсы через CComPtr держутся и ни каких проблем (общий объем кода ~ 150 000 строк рукописного кода).
Покажи как ты его используешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
VD>Ну, лики в баундчекере — это точно твоя заслуга. У нас в проектах все интерфейсы через CComPtr держутся и ни каких проблем (общий объем кода ~ 150 000 строк рукописного кода).
Он же как раз говорит про IxxxPtr, то есть про _com_ptr на сгенеренном с помощью #import враппере.
PS:
VD>Ага а еще надо отметить, что _bstr_t обладает неописуемой кривизной и жадностью к рисурсам. И главное, что с ним никогда не сделать COM-обект размером <= 5 килобайтам. ;o)
Ты так народ напугаешь, что он #import не будет использовать :) Там ведь тоже _bstr_t используется. А в чем кривость-то?
PPS: сколько не пытался, меньше 7 кБ сделать компонент не получалось...
Здравствуйте retalik, Вы писали:
R>Здравствуйте VladD2, Вы писали:
VD>>Ну, лики в баундчекере — это точно твоя заслуга. У нас в проектах все интерфейсы через CComPtr держутся и ни каких проблем (общий объем кода ~ 150 000 строк рукописного кода).
R>Он же как раз говорит про IxxxPtr, то есть про _com_ptr на сгенеренном с помощью #import враппере.
Да? Как обманчива быает природа... подумал ежик...
Ну, тогда дело может быть в обработчике (вернее тарнсляторе) COM-ошибок в C++-исключения. Там был документированный лик. По-моему, в SP5 (или 4) замазали.
R>PS:
VD>>Ага а еще надо отметить, что _bstr_t обладает неописуемой кривизной и жадностью к рисурсам. И главное, что с ним никогда не сделать COM-обект размером <= 5 килобайтам. ;o)
R>Ты так народ напугаешь, что он #import не будет использовать :) Там ведь тоже _bstr_t используется. А в чем кривость-то?
Да, ну... #import-том пльзоваться можно, но только если нет исходников и только так:
VD>>>Ага а еще надо отметить, что _bstr_t обладает неописуемой кривизной и жадностью к рисурсам. И главное, что с ним никогда не сделать COM-обект размером <= 5 килобайтам. ;o)
R>>Ты так народ напугаешь, что он #import не будет использовать :) Там ведь тоже _bstr_t используется. А в чем кривость-то?
VD>Да, ну... #import-том пльзоваться можно, но только если нет исходников и только так: VD>
R>>PPS: сколько не пытался, меньше 7 кБ сделать компонент не получалось...
VD>Наш рекорд 4.5 к. Но говорят, что можно и до сотен байт довести, тока от COM-а там уже мало чего будет. Но 7 к — это тоже не плохо.
Спасибо за ответ. Вроде разобрался. Только не понятно как определить, подцепила ли она Runtime Library или нет. И заодно сколько она добавляет объёма dll-ке?
IT>>CComBSTR — часть библиотеки ATL, _bstr_t — часть RTL для поддежки директивы #import. В этом вся разница.
R>Я думаю, стоит еще отметить, что _bstr_t обладает гораздо большей функциональностью (преобразование в LPCSTR, операторы +, <, += и т.д.). Но "ланчей даром не бывает" — этот класс тянет за собой Runtime Library. Поэтому для разработки компактных ATL-компонентов стоит использовать неприхотливый CComBSTR, а в клиентском коде комфортнее использовать _bstr_t.
Еще: у CComBSTR подлежащий BSTR может быть впрямую изменен, в отличие от _bstr_t.
Здравствуйте ligett, Вы писали:
L>Спасибо за ответ. Вроде разобрался. Только не понятно как определить, подцепила ли она Runtime Library или нет. И заодно сколько она добавляет объёма dll-ке?
Просто: если линкуется в Release с макросом _ATL_MIN_CRT, значит не подцепила :)
А размер — что-то около 25 кил, если не ошибаюсь.