Подключится к COM-обьекту (SolidWorks) в ATL-проекте
'--------------------------------
'
' Preconditions: Part is open and has a configuration named aaa.
'
' Postconditions: None
'
'---------------------------------
#define USING_DEBUG_SOLIDWORKS TRUE
#ifdef _DEBUG && USING_DEBUG_SOLIDWORKS
#define AFX_MANAGE_STATE_ADDIN AFX_MANAGE_STATE(AfxGetAppModuleState());
#else
#define AFX_MANAGE_STATE_ADDIN AFX_MANAGE_STATE(AfxGetStaticModuleState());
#endif
// -------------------------------------------------------------------
STDMETHODIMP CAPITestATL::API_Test(void)
{
AFX_MANAGE_STATE_ADDIN;
HRESULT hr = S_OK;
CComPtr <ISldWorks> pSldWorks;
CComPtr <IModelDoc2> pModel;
CComPtr <IConfigurationManager> pCfgMgr;
CComBSTR sCfgName(_T("aaa"));
long NumParams = 0;
long i = 0;
BSTR *vNames = NULL;
BSTR *vValues = NULL;
VARIANT_BOOL bret = VARIANT_FALSE;
try
{
// Connect to SolidWorks
ASSERT(m_iSldWorks);
hr = m_iSldWorks->get_IActiveDoc2(&pModel);
ASSERT(pModel);
hr = pModel->get_ConfigurationManager(&pCfgMgr);
ASSERT(pCfgMgr);
hr = pCfgMgr->GetConfigurationParamsCount(sCfgName, &NumParams);
ASSERT(NumParams > 0);
vNames = new BSTR[NumParams]; ASSERT(vNames );
vValues = new BSTR[NumParams]; ASSERT(vValues);
hr = pCfgMgr->IGetConfigurationParams(sCfgName, NumParams, vNames, vValues, &bret);
ASSERT(bret);
for (i = 0; i < NumParams; i++)
{
CComBSTR sName ;
CComBSTR sValue;
sName .Attach(vNames );
sValue.Attach(vValues);
OutputDebugString(sName );
OutputDebugString(_T("\n"));
OutputDebugString(sValue);
OutputDebugString(_T("\n"));
}
delete [] vNames ;
delete [] vValues ;
}
catch (...)
{
DebugBreak();
}
delete [] vNames ;
delete [] vValues ;
return S_OK;
}
в моём проете этот пример конечно сразу не заработает. Сначала просто вставляю переменную, которая будет ссылкой на COM-обект:
private:
CComPtr <ISldWorks> pSldWorks
получаю ошибку:
swcom.h(101) : error C2065: ISldWorks: необъявленный идентификатор
Обьясните пожалйста какую последовательность действий нужно сделать чтобы подключить COM-обект? На форуми нашол темы которые касаются COM-обьекта SolidWorks, одной из них автором был oxotnik333, если вы прочтёте мой вопрос, поделитись пожалуйста пример. Большое спасибо!
у солида на офф сайте есть замечательный пример как подключать свой плагин и как в нем подписываться на события. В свое время делал, если время ждет могу через недельку другую выложить (на работе все осталось)
Цитата: oxotnik333
у солида на офф сайте есть замечательный пример как подключать свой плагин и как в нем подписываться на события. В свое время делал, если время ждет могу через недельку другую выложить (на работе все осталось)
Счас гляну у солида на офф сайте. Если вам не будет трудно выложите сдесь, или мне на hztp_serg at ukr dot net пусть будет через неделю, или когда вам выйдет. Поак буду разбиратся.
// stdafx.h: включаемый файл для стандартных системных включаемых файлов
// или включаемых файлов для конкретного проекта, которые часто используются,
// но не часто изменяются
#pragma once
#ifndef STRICT
#define STRICT
#endif
#include "targetver.h"
#define _ATL_APARTMENT_THREADED
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // некоторые конструкторы CString будут явными
#include "resource.h"
#include <atlbase.h>
#include <atlcom.h>
#include <atlctl.h>
using namespace ATL;
В примере который реализует подключение к COM-обьекта SolidWorks этот файл имеет:
#import "swpublished.tlb" raw_interfaces_only, raw_native_types, named_guids, auto_search
#import "sldworks.tlb" raw_interfaces_only, raw_native_types, named_guids, auto_search, rename("PropertySheet", "ShowPropertySheet"),rename("GetOpenFileName", "SWGetOpenFileName")
#import "swconst.tlb"
//SolidWorks TypeLibrary Versions
#define ID_SLDWORKS_TLB_MAJOR 14
#define ID_SLDWORKS_TLB_MINOR 0
#define ID_SWPUBLISHED_TLB_MAJOR 1
#define ID_SWPUBLISHED_TLB_MINOR 0
using namespace ATL;
using namespace SldWorks;
using namespace SWPublished;
using namespace SwConst;
В VS2008 ATL-проекте это всё ручками надо прописывать, или или этот код автоматом генерится при добавлении интерфейса или какого-то класса связаного с COM-обьектом SolidWorks? Если автоматом, то что нужно для этого сделать? Большое спасибо!
Я писал все руками (поначалу) потом как достало меня это разбирательство взял и переделал их пример под свои нужды (выкинул все что не надо и добавил своего)
CComPtr<ISldWorks> iSwApp
как проверить, содержит ли эта переменная ссылку на обьект?
Цитата: hztp_serg
Обьявил переменную:
CComPtr<ISldWorks> iSwApp
как проверить, содержит ли эта переменная ссылку на обьект?
CComPtr<ISldWorks> iSwApp
как проверить, содержит ли эта переменная ссылку на обьект?
сама по себе после объявления не содержит
надо через CoCreateInstance если не через плагин, если через плагин то там автоматом солид подгружает его и передает ссылку на свой интерфейс
Цитата: oxotnik333
сама по себе после объявления не содержит
надо через CoCreateInstance если не через плагин, если через плагин то там автоматом солид подгружает его и передает ссылку на свой интерфейс
надо через CoCreateInstance если не через плагин, если через плагин то там автоматом солид подгружает его и передает ссылку на свой интерфейс
где можно посмотреть как через плагин подгрузить COM-обьект в ATL-проект?
Цитата: hztp_serg
где можно посмотреть как через плагин подгрузить COM-обьект в ATL-проект?
ну скачай же пример этого плагина (в хелпе к АПИ есть даже вроде как прямая ссылка)
PS: при компиляции он сам в реестр все вносит, и руками ничего регистрировать не надо