CComBSTR vs BSTR
От: Denwer Россия  
Дата: 24.06.03 13:13
Оценка:
Ну начну с примера


IHTMLDocument2* pDocument;
.........
CComBSTR bsTable = L"TABLE";    
BSTR bsTable1 = L"TABLE";

CComQIPtr<IHTMLElement> pElementTable;
pDocument->createElement(bsTable, &pElementTable); //Так работает
pDocument->createElement(bsTable1, &pElementTable); //а так НЕТ


Вопрос почему такое?

ЗЫ: вот объявление этой функции
virtual HRESULT STDMETHODCALLTYPE createElement ( BSTR eTag, IHTMLElement **newElem) = 0
Re: CComBSTR vs BSTR
От: UnrealAlex Россия  
Дата: 24.06.03 13:18
Оценка: +2
Здравствуйте, Denwer, Вы писали:

IHTMLDocument2* pDocument;
.........
CComBSTR bsTable  = L"TABLE";    
BSTR     bsTable1 = ::SysAllocString(L"TABLE"); // !!!

CComQIPtr<IHTMLElement> pElementTable;

pDocument->createElement(bsTable, &pElementTable); //Так работает

pElementTable = 0; // !!! (иначе потеряешь первый объект или будет AddRef без Release)

pDocument->createElement(bsTable1, &pElementTable); //а теперь????
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re: CComBSTR vs BSTR
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.06.03 13:30
Оценка:
Здравствуйте, Denwer, Вы писали:


D>BSTR bsTable1 = L"TABLE";


Потому что L"TABLE" не является корректной BSTR-строкой.
а что значит не работает?
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 24.06.03 13:31
Оценка:
а что значит не работает?
... << RSDN@Home 1.0 beta 6a >>
Re[2]: CComBSTR vs BSTR
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 24.06.03 13:31
Оценка: 6 (2) +1
UA>Здравствуйте, Denwer, Вы писали:

И, на всякий пожарный:
BSTR     bsTable1 = ::SysAllocString(L"TABLE"); // !!!

//....

//И не забываем вызвать !
::SysFreeString(bsTable1);

Лучше использовать CComBSTR - меньше головной боли и больше надежности.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: L"TABLE" - это не BSTR
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.06.03 13:31
Оценка: 4 (1) +1
Здравствуйте, Denwer, Вы писали:

D>BSTR bsTable1 = L"TABLE";

Ошибка здесь. L"TABLE" — это не BSTR, а LPWSTR. А дальше — из этого все и вытекает.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Аблажался =)
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 24.06.03 13:32
Оценка:
коченчно же SysAllocString надо вызывать как предыдущие ораторы говорили
... << RSDN@Home 1.0 beta 6a >>
Re[2]: CComBSTR vs BSTR
От: Denwer Россия  
Дата: 24.06.03 13:32
Оценка:
Здравствуйте, UnrealAlex, Вы писали:

UA>Здравствуйте, Denwer, Вы писали:


UA>
UA>IHTMLDocument2* pDocument;
UA>.........
UA>CComBSTR bsTable  = L"TABLE";    
UA>BSTR     bsTable1 = ::SysAllocString(L"TABLE"); // !!!

UA>CComQIPtr<IHTMLElement> pElementTable;

UA>pDocument->createElement(bsTable, &pElementTable); //Так работает

UA>pElementTable = 0; // !!! (иначе потеряешь первый объект или будет AddRef без Release)

UA>pDocument->createElement(bsTable1, &pElementTable); //а теперь????
UA>


Ну ясен перец что я эти две функции вместе не вызываю, либо вариант 1 либо вариант 2.
Даже если бы и потерялась ссылка, это было бы все го то мемори ликс, а в моем случае это не создание объекта.

Это я понял что собака порылась в ::SysAllocString(L"TABLE"); Хотелось бы объяснения получить, если можно.

Заранее спасибо.
Re[3]: CComBSTR vs BSTR
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.06.03 13:38
Оценка: 4 (1)
Здравствуйте, Denwer, Вы писали:

D>Это я понял что собака порылась в ::SysAllocString(L"TABLE"); Хотелось бы объяснения получить, если можно.


BSTR строка для in паратетра должна предворятся 4-байтами, с указанием длины. L"TABLE" — этого не делает в отличие от SysAllocString
Re[3]: CComBSTR vs BSTR
От: George Seryakov Россия  
Дата: 24.06.03 14:55
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Это я понял что собака порылась в ::SysAllocString(L"TABLE"); Хотелось бы объяснения получить, если можно.


То, что ты передаешь в место BSTR, не будет корректно маршалиться.
GS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.