Re: Падения программы при закрытии
От: Gleb Zemskov  
Дата: 13.04.03 04:29
Оценка: -1
Здравствуйте, LEugene, Вы писали:

LE>Есть СОМ-объект из которого вызывается другой СОМ-объект. Делается это примерно вот так:

LE>
LE>IXXPtr* pPtr;
LE>try
LE>{
LE>    pPtr = new IXXPtr(__uuidof(XX));
LE>}
// зачем все это создавать динамически?
LE>catch(_com_error& e)
LE>{
LE>    AfxMessageBox(*e.ErrorMessage());
//это у тебя скомпилировалось? Наверное у тебя все-таки AfxMessageBox(e.ErrorMessage());
LE>    return;
LE>}
LE>BSTR bstrX1[100], bstrX2[100];
//здесь у тебя абсолютно неправильная конструкция, которая действительно может давать ошибки 
//(измена в стеке)
//Поясню:
//BSTR указывает на строку символов OLECHAR*, однако при выделении памяти через SysAllocString и др.
// аналогичные функции перед массивом символов выделяется еще DWORD с длиной строки. Таким образом,
// при работе с bstrX1 у тебя затирается стек перед bstrX1
LE>(*pPtr)->XXMethod(bstrX1, bstrX2);
//это кажется тоже не должно компилироваться
LE>delete pPtr;
LE>

LE>Так вот, если этот кусок выполняется, то при завершении программы неск. раз выскакивает "Программа выполнила недопустимую операцию...". Не подскажете-ли, где тут собака порылась?
Свой вариант:
BSTR bstrX1;
BSTR bstrX2;
try
{
    IXXPtr pPtr(__uuidof(XX);
    pPtr->XXMethod(&bstrX1, &bstrX2);
}
catch(_com_error& e)
{
    AfxMessageBox(*e.ErrorMessage());
}
//некоторая работа с полученными BSTR
// ..........

//освобождение строк
if (bstrX1) ::SysFreeString(bstrX1);
if (bstrX2) ::SysFreeString(bstrX2);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.