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

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

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн MihanpanАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Если ошибся разделом форума, перенесите, пожалуйста.


Вводная:

Приложение 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++ [Выбрать]
  1. m_pCtrl=new CDwgViewrCtrl;
  2. m_pCtrl->m_CLSID = clsid; // = { 0x6C7DC044, 0xFB1E, 0x4140, { 0x92, 0x23, 0x5, 0x2E, 0x5A, 0xBE, 0x7D, 0x24 } };
  3. if( !m_pCtrl->Create(_T("DWGTV"), WS_VISIBLE|WS_BORDER|WS_CHILD, rect, this, IDC_MYPREVIEW) )
  4. {
  5.         delete m_pCtrl;
  6.         m_pCtrl=NULL;
  7. }
  8.  

Загружаем файл чертежа

Код - C++ [Выбрать]
  1. try
  2. {
  3.         if(m_pCtrl)
  4.                 m_pCtrl->PutSourcePath(sDwg);
  5. }
  6. catch (CException* e)
  7. {
  8.         TCHAR buf[1024];
  9.         e->GetErrorMessage(buf, 1024);  
  10.         e->Delete();
  11.         str.Format(_T("Ошибка при загрузке файла\n '%s'\nСообщение: '%s'"), sDwg, buf);
  12.         MessageBox(str, _T("Упс..."));
  13. }
  14.  

И, соответственно, класс контрола

Код - C++ [Выбрать]
  1.  
  2. class CDwgViewrCtrl : public CWnd
  3. {
  4. protected:
  5.         DECLARE_DYNCREATE(CDwgViewrCtrl)
  6. public:
  7.         CLSID m_CLSID;
  8.         virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
  9.                 const RECT& rect, CWnd* pParentWnd, UINT nID,
  10.                 CCreateContext* pContext = NULL)
  11.         {
  12.                 return CreateControl(m_CLSID, lpszWindowName, dwStyle, rect, pParentWnd, nID);
  13.         }
  14.  
  15.         BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
  16.                 UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
  17.                 BSTR bstrLicKey = NULL)
  18.         {
  19.                 return CreateControl(m_CLSID, lpszWindowName, dwStyle, rect, pParentWnd, nID,
  20.                         pPersist, bStorage, bstrLicKey);
  21.         }
  22.  
  23.         long PutSourcePath(LPCTSTR strPathname)
  24.         {
  25.                 long result;
  26.                 static BYTE parms[] = VTS_BSTR ;
  27.                 InvokeHelper(0x2, DISPATCH_METHOD, VT_I4, (void*)&result, parms, strPathname);
  28.                 return result;
  29.         }
  30.  
  31. };
  32.  
« Последнее редактирование: 04-09-2015, 14:27:32 от Mihanpan »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В первую очередь нужно понять какой код исключения. Так что обработкой общего CException ты не отделаешься.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн MihanpanАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
COleDispatchException

m_scError = 0x80004002 для {4E871D32-203E-4777-B42A-451FC1B2FC90}
m_scError = 0x80040154 для {6C7DC044-FB1E-4140-9223-052E5ABE7D24}

m_wCode = 0, m_strDescription="" в обоих случаях


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
0x80040154 - Класс не зарегистрирован
0x80004002 - Интерфейс не поддерживается
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн MihanpanАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Спасибо.

Похоже, проблема возникает, когда более раннюю версию (2012) удаляют после установки более поздней (2014).

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

Отмечено как Решение Mihanpan 09-09-2015, 10:14:22

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Похоже, проблема возникает, когда более раннюю версию (2012) удаляют после установки более поздней (2014).
Возможно. Попробуй переустановить 2014-ую.
Александр, а не подскажете, где можно посмотреть список кодов этого исключения с расшифровкой?
На будущее и для общего развития.
Файл WinError.h - "кладезь знаний".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн MihanpanАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Файл WinError.h - "кладезь знаний".

[ смайлик, стучащий себя по лбу ]

Благодарю!