Здравствуйте, 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);