Так вот, если этот кусок выполняется, то при завершении программы неск. раз выскакивает "Программа выполнила недопустимую операцию...". Не подскажете-ли, где тут собака порылась?
PS: Использую MSVC6 SP5
Здравствуйте, Ivan, Вы писали:
I>Этот код неправильный, COM объекты создаются по другому, а смарт-пойнтеры, как правило создаются на стеке, а не в динамической памяти
Что именно в этом коде неправильного? Смарт-поинтеры нельзя создавать динамически?
PS: В любом случае, создание объекта в стеке не помогло...
Здравствуйте, LEugene, Вы писали:
LE>Что именно в этом коде неправильного? Смарт-поинтеры нельзя создавать динамически?
сорри, погорячился, так создавать можно, просто редко встретишь код, в котором смарт-пойнтер в динамической памяти создается
LE>PS: В любом случае, создание объекта в стеке не помогло...
А на чем AV ?
Здравствуйте, LEugene, Вы писали:
LE>Что именно в этом коде неправильного?
Это зависит от того, что ты хотел достьчь. Если ты хотел создать COM-объект, то этот код неправильный. Если ты хотел создать смарт-поинтер в динамисеской памяти, то правильный.
LE>Смарт-поинтеры нельзя создавать динамически?
можно. Но обычно это не нужно.
LE>PS: В любом случае, создание объекта в стеке не помогло...
Для создания COM-объекта используй метод CreateInstance смарт-поинтера.
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, LEugene, Вы писали:
LE>Что именно в этом коде неправильного? SH>Это зависит от того, что ты хотел достьчь. Если ты хотел создать COM-объект, то этот код неправильный.
Сорри, я забыл что такие смарт-поинтеры отличаются от CComPtr..
LE>Так вот, если этот кусок выполняется, то при завершении программы неск. раз выскакивает "Программа выполнила недопустимую операцию...". Не подскажете-ли, где тут собака порылась? LE>PS: Использую MSVC6 SP5
С BSTR-ами так не работаю. Попроюуй что ниюудь типа
BSTR'ы тут непричем и занесение вызова метода под try тоже. Параметры у меня возвращаемые и значения им присваиваются внутри XXMethod. Сам метод работает правильно, исключений нигде не выбрасывается.
Я подозреваю, что все дело в том, что создание объекта XX и вызов одной из его функций оставляют после себя что-то, что и является причиной ошибки. Весь вопрос в том, что-именно?
LE>BSTR'ы тут непричем и занесение вызова метода под try тоже. Параметры у меня возвращаемые и значения им присваиваются внутри XXMethod. Сам метод работает правильно, исключений нигде не выбрасывается.
Здравствуйте, 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);
Конструктор не трогал — он оставлен таким, каким сделал его визард. Да, класс CYYDlg — наследник CDialog, а его функция GetX делает DoModal и соответственно устанавливает значения обоих параметров.