Если ошибся разделом форума, перенесите, пожалуйста.
Вводная:Приложение 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}) и создаем:
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;
}
Загружаем файл чертежа
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("Упс..."));
}
И, соответственно, класс контрола
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;
}
};