Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

страшные глюки BSTR/CComBSTR (VC++6)

Здравствуйте,
при написании COM-объектов обычно используются UNICODE-строки, для
которых есть тип BSTR и класс-оболочка CComBSTR. Я пишу функцию,
что-то типа
func(BSTR bsArg1) {
CComBSTR bsLoc1;
CComBSTR bsLoc2;
CComBSTR bsLoc3;
// ...
bsLoc1 = bsArg1;
bsLoc2 = CComBSTR("text1");
bsLoc2 = CComBSTR("text2");
// ...
}
функция как надо не работает. Смотрю в отладчике и вижу... в строчке
bsLoc1 = bsArg1 в локальную переменную записывается СОВСЕМ НЕ ТО ЧТО
БЫЛО ПЕРЕДАНО КАК АРГУМЕНТ! А записывается туда или одна из строк
text1, text2, или "text1text2". Это что? Глюки реализации или
компилятора? И как с этим бороться?

Ответить   Thu, 22 Apr 2004 01:22:38 +0400 (#130629)

 

Ответы:

Привет!

А в курсе, что SP6 вышел?

Ответить   Thu, 22 Apr 2004 12:34:00 -0800 (#130871)

 

Бороться единственным способом - смотреть исходники в 'atl\include'.
Правдя, я сильно сомневаюсь, что в таком часто используемом
коде могли остаться глюки - скорее всего, они в собственной
программе. У меня VC5, и аналогичный код работает
без малейших проблем:

int TestFunc1(BSTR bsArg1) {
CComBSTR bsLoc1;
CComBSTR bsLoc2;
CComBSTR bsLoc3;
// ... кстати, CComBSTR() вокруг строки ни к чему ...
bsLoc1 = bsArg1;
bsLoc2 = CComBSTR("text1");
bsLoc3 = CComBSTR("text2");
// ...
PutText("(1) bsLoc1",bsLoc1);
PutText("(1) bsLoc2",bsLoc2);
PutText("(1) bsLoc3",bsLoc3);
return 0;
}

int TestFunc2(BSTR bsArg1) {
CComBSTR bsLoc1(bsArg1);
CComBSTR bsLoc2("text1");
CComBSTR bsLoc3("text2");
// ...
PutText("(2) bsLoc1",bsLoc1);
PutText("(2) bsLoc2",bsLoc2);
PutText("(2) bsLoc3",bsLoc3);
return 0;
}

void main (void) {
// ...
pwsz = SysAllocString(L"text0");
TestFunc1(pwsz);
TestFunc2(pwsz);
SysFreeString(pwsz);
// ...
}

Единственное предположение о причине проблемы. Возможно, где-то
используется BSTR, для которого уже вызвана SysFreeString.
Программа в этом случае валится редко, поскольку
ведется кэш коротких освобожденных строк, но
мистическим образом строки начинают
менять свое содержимое :)
Номер выпуска : 2911
Возраст листа : 213 (дней)
Количество подписчиков : 387
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/130966
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 22 Apr 2004 15:08:02 +0400 (#130966)