ADN Club > Другие продукты Autodesk
Использование DWG TrueView различных версий в своем приложении (С++)
Mihanpan:
Если ошибся разделом форума, перенесите, пожалуйста.
Вводная:
Приложение MFC Win32. В окне создается контрол от DWG TrueView, в нем отображается чертеж.
Проблема:
На одном компьютере (Win 7 x64, установлены DWG TrueView 2012,2014,2016) все работает, контрол создается, файл отображается.
На другом (Win 7 x64, установлены DWG TrueView 2014,2016; ранее были установлены 2010,2012,2013, но сейчас деинсталлированы) контрол создается, но выполнение PutSourcePath выбрасывает исключение без описания (т.е. e->GetErrorMessage возвращает пустую строку)
Детали:
Контрол создаем динамически - смотрим в реестре
HKEY_CLASSES_ROOT\Autodesk.AcCtrl
HKEY_CLASSES_ROOT\Autodesk.DwgViewrAcCtrl
HKEY_CLASSES_ROOT\Autodesk.dwgviewrCtrl.1
HKEY_CLASSES_ROOT\Autodesk.DWGVCtrl.1
Выясняем, какой из разделов есть на данной машине. Если есть - читаем его CLSID (опытным путем выяснили, что это либо {4E871D32-203E-4777-B42A-451FC1B2FC90}, либо {6C7DC044-FB1E-4140-9223-052E5ABE7D24}) и создаем:
--- Код - C++ [Выбрать] ---m_pCtrl=new CDwgViewrCtrl;m_pCtrl->m_CLSID = clsid; // = { 0x6C7DC044, 0xFB1E, 0x4140, { 0x92, 0x23, 0x5, 0x2E, 0x5A, 0xBE, 0x7D, 0x24 } };if( !m_pCtrl->Create(_T("DWGTV"), WS_VISIBLE|WS_BORDER|WS_CHILD, rect, this, IDC_MYPREVIEW) ){ delete m_pCtrl; m_pCtrl=NULL;}
Загружаем файл чертежа
--- Код - C++ [Выбрать] ---try{ if(m_pCtrl) m_pCtrl->PutSourcePath(sDwg); }catch (CException* e){ TCHAR buf[1024]; e->GetErrorMessage(buf, 1024); e->Delete(); str.Format(_T("Ошибка при загрузке файла\n '%s'\nСообщение: '%s'"), sDwg, buf); MessageBox(str, _T("Упс..."));}
И, соответственно, класс контрола
--- Код - C++ [Выбрать] --- class CDwgViewrCtrl : public CWnd{protected: DECLARE_DYNCREATE(CDwgViewrCtrl)public: CLSID m_CLSID; virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL) { return CreateControl(m_CLSID, lpszWindowName, dwStyle, rect, pParentWnd, nID); } BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE, BSTR bstrLicKey = NULL) { return CreateControl(m_CLSID, lpszWindowName, dwStyle, rect, pParentWnd, nID, pPersist, bStorage, bstrLicKey); } long PutSourcePath(LPCTSTR strPathname) { long result; static BYTE parms[] = VTS_BSTR ; InvokeHelper(0x2, DISPATCH_METHOD, VT_I4, (void*)&result, parms, strPathname); return result; } };
Александр Ривилис:
В первую очередь нужно понять какой код исключения. Так что обработкой общего CException ты не отделаешься.
Mihanpan:
COleDispatchException
m_scError = 0x80004002 для {4E871D32-203E-4777-B42A-451FC1B2FC90}
m_scError = 0x80040154 для {6C7DC044-FB1E-4140-9223-052E5ABE7D24}
m_wCode = 0, m_strDescription="" в обоих случаях
Александр Ривилис:
0x80040154 - Класс не зарегистрирован
0x80004002 - Интерфейс не поддерживается
Mihanpan:
Спасибо.
Похоже, проблема возникает, когда более раннюю версию (2012) удаляют после установки более поздней (2014).
Александр, а не подскажете, где можно посмотреть список кодов этого исключения с расшифровкой?
На будущее и для общего развития.
Навигация
Перейти к полной версии