Здравствуйте, LEugene, Вы писали:
GS>>Показывай конструктор (включая FinslConstruct) IXX и код метода XXMethod.
LE>LE>STDMETHODIMP CXX::XXMethod(BSTR *p_bstrX1, BSTR *p_bstrX2, long *pVal)
LE>{
LE> AFX_MANAGE_STATE(AfxGetStaticModuleState())
LE> CString szX1, szX2;
LE> CYYDlg dlg;
LE> if (dlg.GetX(szX1, szX2))
LE> {
LE> *p_bstrX1 = szX1.AllocSysString();
LE> *p_bstrX2 = szX2.AllocSysString();
LE> *pVal = 0;
LE> }
LE> else
{
*p_bstrX1 = 0;
*p_bstrX2 = 0;
*pVal = -1;
LE> }
LE> return S_OK;
LE>}
LE>
Но проблема, видимо, не здесь. Что ты делаешь дальше, после:
LE>IXXPtr pPtr(__uuidof(XX));
LE>BSTR bstrX1, bstrX2;
LE>pPtr->XXMethod(&bstrX1, &bstrX2);
?
Здравствуйте, 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());
LE> return;
LE>}
LE>BSTR bstrX1[100], bstrX2[100];
LE>(*pPtr)->XXMethod(bstrX1, bstrX2);
LE>delete pPtr;
LE>
LE>Так вот, если этот кусок выполняется, то при завершении программы неск. раз выскакивает "Программа выполнила недопустимую операцию...". Не подскажете-ли, где тут собака порылась?
LE>PS: Использую MSVC6 SP5
У меня была похожая проблема: Деструктор смарт-поинтера вызывался после CoUninitialize().
int main() {
CoInitialize(0) ;
IXXXX obj ;
try {
obj.CreateInstance(__uuidof(XXXX)) ;
...
} catch(_com_error& e) {
printf( "error\n" ) ;
}
CoUninitialize() ;
}
Я это написал по памяти, в прямую может не работать. Ошибка вываливается при выходе из main. Решается строкой перед CoUninitialize(): obj = NULL ;
Удачи,
Может поможет.
ME>Но проблема, видимо, не здесь. Что ты делаешь дальше, после:
ME>LE>IXXPtr pPtr(__uuidof(XX));
LE>BSTR bstrX1, bstrX2;
LE>pPtr->XXMethod(&bstrX1, &bstrX2);
ME>
После вывожу полученные значения в соотвесттвующие CEdit'ы. Делаю это обычным SetWindowText'ом. Тут не должно быть ошибки — слишком все просто...
Здравствуйте, gwg-605, Вы писали:
G6>Здравствуйте, LEugene, Вы писали:
LE>Есть СОМ-объект из которого вызывается другой СОМ-объект. Делается это примерно вот так:
LE>[ccode]
LE>IXXPtr* pPtr;
LE>try
LE>{
LE> pPtr = new IXXPtr(__uuidof(XX));
LE>}
LE>catch(_com_error& e)
LE>{
LE> AfxMessageBox(*e.ErrorMessage());
LE> return;
LE>}
LE>BSTR bstrX1[100], bstrX2[100];
LE>(*pPtr)->XXMethod(bstrX1, bstrX2);
LE>delete pPtr;
G6>У меня была похожая проблема: Деструктор смарт-поинтера вызывался после CoUninitialize().
Дык... В моем-то коде деструктор вызывается явно (delete pPtr

и явно до того как сработает CoUninitialize()...
Здравствуйте, LEugene, Вы писали:
ME>Но проблема, видимо, не здесь. Что ты делаешь дальше, после:
ME>LE>IXXPtr pPtr(__uuidof(XX));
LE>BSTR bstrX1, bstrX2;
LE>pPtr->XXMethod(&bstrX1, &bstrX2);
ME>
LE>После вывожу полученные значения в соотвесттвующие CEdit'ы. Делаю это обычным SetWindowText'ом. Тут не должно быть ошибки — слишком все просто...
Вроде, все ОК. Тогда давай проверять, что в конце выскакивает наведенная ошибка. Начинай комментировать все, кроме вызова XXMethod и использования результатов и смотри — не исчезнет ли сбой.