Проверка состояния готовности AutoCAD с использованием OLE
Вопрос:
Как можно проверить статус готовности AutoCAD средствами OLE автоматизации? Как можно предотвратить диалог "Ошибка. Сервер занят" ("Server Busy Error")?
Ответ:
Для надежной проверки того доступен ли AutoCAD для вызова или нет вы можете использовать проверку IAcadState. Вам нужно создать глобальный инициализированный объект IAcadState в момент когда AutoCAD не занят. Для любых последующих запросов автоматизации вы можете проверять состояние занятости AutoCAD используя объект IAcadState, а затем или дождаться когда AutoCAD освободится или отменить запрос.
Также вы можете использовать класс COleMessageFilter для установки свойств OLE автоматизации. Если вы не хотите чтобы появлялся диалог ошибки занятости сервера, вы можете подавить его, используя COleMessageFilter. Вы можете заставить своё приложение ждать пока AutoCAD не освободится и будет готов выполнять ваши запросы без показа диалога занятости сервера. Следующий пример показывает как можно этого достичь:
- COleException e;
- CComPtr<IAcadApplication> aApp;
- CComPtr<IAcadState> aState;
- COleMessageFilter* pFilter;
- // Инициализируем IAcadState
- // чтобы быть уверенным что AutoCAD
- // готов выполнить запрос.
- void iniState()
- {
- // Получаем активный AutoCAD – мы внутри процесса
- IDispatch* pDisp = acedGetAcadWinApp()->GetIDispatch(TRUE);
- HRESULT hr = pDisp->QueryInterface(IID_IAcadApplication,
- (void**)&aApp);
- if(FAILED(hr))
- return;
- if(aApp != NULL)
- {
- aApp->GetAcadState(&aState);
- }
- }
- // Позже когда мы хотим выполнить обращение к AutoCAD,
- // проверим IAcadState и только тогда используя
- // AcadState проверим занят он или нет
- void checkIfBusy()
- {
- VARIANT_BOOL bReady = VARIANT_FALSE;
- aState->get_IsQuiescent(&bReady);
- if(bReady == VARIANT_TRUE)
- {
- CComPtr<IAcadDocument> aDoc;
- aApp->get_ActiveDocument(&aDoc);
- }
- else
- AfxMessageBox(_T("AutoCAD сейчас занят!"),
- MB_SYSTEMMODAL );
- }
- // Вы можете также захотеть изменить стандартное поведение приложения
- // в том, как оно обрабатывает состояние занятости сервера.
- // Посмотрите детали в MSDN
- //// устанавливаем свойства взаимодействия приложения с OLE
- pFilter = AfxOleGetMessageFilter();
- ASSERT(pFilter != NULL);
- DWORD dTimedelay = 1000;
- pFilter->SetMessagePendingDelay(dTimedelay);
- dTimedelay = -1;
- pFilter->SetRetryReply(dTimedelay);
- pFilter->EnableBusyDialog(FALSE);
- pFilter->EnableNotRespondingDialog(FALSE);
Источник: http://adndevblog.typepad.com/autocad/2013/01/check-the-idle-status-of-autocad-using-ole.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=75.0
Отредактировано 08.06.2013 в 01:48:28