прошагала все, что можно....
Пишу все по порядку....
Есть прибор, есть для него ПО, написанное, как СОМ сервер... Мне нужно написать ПО клиента... Класс IAutomation формируется из файла *.tlb, который идет в комплекте с ПО к прибору...
Что представляет из себя ПО сервера могу тока догадываться... никакого описания нет...
Код: Выделить всё
void CPlanarDlg::OnPusk() //обработка нажатия кнопки CButton
{
BOOL result = nwa.CreateDispatch("Obzor102.Automation"); //Подключение к серверу
if(result!=TRUE) AfxMessageBox("COM-object didn't create");//и запуск приложения
Obzor103.exe nwa.Minimize(); //Минимизация окна приложения Obzor103.exe
BOOL connect = nwa.GetConnected();//Проверка включения прибора и его готовности к работе
UpdateData(FALSE);
}
void CPlanarDlg::OnScan() //обработка нажатия кнопки CButton
{
//ЧИСЛО ТОЧЕК СКАНИРОВАНИЯ
CString str;
CWnd* pWnd = GetDlgItem(IDC_POINTS_SCAN);
pWnd->EnableWindow(TRUE);
pWnd->GetWindowText(str); // берем данные из окна IDC_POINTS_SCAN и передаем переменной str
this->UpdateData(TRUE); // присваиваем переменной str значение
pWnd long nResult = atol(str);// конвертируем данные из типа CString в тип long
this->UpdateData(FALSE);
nwa.SetGPoints(nResult);//передаем значение nResult объекту автоматизации
this->UpdateData(FALSE);
//ПЕРВАЯ ЧАСТОТА
CString str_freq_1;
CWnd* pWnd1 = GetDlgItem(IDC_FREQ_1);
pWnd1->EnableWindow(TRUE);
pWnd1->GetWindowText(str_freq_1); // берем данные из окна IDC_FREQ_1и передаем переменной str_freq_1
this->UpdateData(TRUE);
long nFreq_1 = atol(str_freq_1);// конвертируем данные из типа CString в тип long
this->UpdateData(FALSE);
nwa.SetGStart(nFreq_1);//начальная частота сканирования (передаем объекту автомат.)
nwa.SetGStop(nFreq_1);//конечная частота сканирования (передаем объекту автомат.)
this->UpdateData(FALSE);
CWnd* pWnd2 = GetDlgItem(IDC_KSV_1);
pWnd2->EnableWindow(TRUE);
double f2;
f2 = nwa.GetGStop();
this->UpdateData(FALSE);
m_KSV_1 = nwa.GetChValue(4, f2);
this->UpdateData(FALSE);
}
nwa - глобальная переменная класса IAutomation.
из строки
из класса CPlanarDlg скачем в класс IAuromation в функцию
Код: Выделить всё
double IAutomation::GetGStop()
{
double result;
InvokeHelper(0x7, DISPATCH_PROPERTYGET, VT_R8, (void*)&result, NULL);
return result;
}
из этой функции в OLEDISP2.CPP в
Код: Выделить всё
void AFX_CDECL COleDispatchDriver::InvokeHelper(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...)
{
va_list argList;
va_start(argList, pbParamInfo);
InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo, argList);
va_end(argList);
}
все прекрасно обрабатывается, скачет в класс IAutomation, возвращает результат, скачет в CPlanarDlg и выдает данные в нужное место (переменная или окошечко моей диалоговой панели)...
На следующей строке
мы опять же из класса CPlanarDlg скачем в класс IAuromation, но в функцию
Код: Выделить всё
double IAutomation::GetChValue(long Channel, double Frequency)
{
double result;
static BYTE parms[] =
VTS_I4 VTS_R8;
InvokeHelper(0x20, DISPATCH_PROPERTYGET, VT_R8, (void*)&result, parms,
Channel, Frequency);
return result;
}
здесь, похоже, возникает какая-то проблема с объявлением массива static BYTE parms[] =VTS_I4 VTS_R8; т.к. отладчик эту строку просто проскакивает и сразу переходит к InvokeHelper(...), а из InvokeHelper скачет в тот же OLEDISP2.CPP, но уже в функцию
Код: Выделить всё
void AFX_CDECL COleDispatchDriver::InvokeHelper(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...)
{
va_list argList;
va_start(argList, pbParamInfo);
InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo, argList);
va_end(argList);
}
а из этой функции при обработке InvokeHelperV, а именно параметра pbParamInfo выкидывает в этот самый WINCORE.CPP
Код: Выделить всё
LRESULT lResult;
TRY
{
...
}
CATCH_ALL(e)
{
lResult = AfxGetThread()->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
lResult);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
где на первой строке lResult =... отладчик подвисает....