ADN Club > Другие продукты Autodesk

Использование DWG TrueView различных версий в своем приложении (С++)

(1/2) > >>

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).

Александр, а не подскажете, где можно посмотреть список кодов этого исключения с расшифровкой?
На будущее и для общего развития.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии