马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
问题:
Are there two ways of creating an AutoCAD ActiveX client using C++?
解答:
There are two ways of creating an AutoCAD Active X client using C++.
Method #1
Use MFC ClassWizard to import the interfaces (from acad.tlb) that you need for
your client application.
Method #2
Use #import with acad.tlb.
NOTE: Although #import is something new from VC++ 5.0, it previously existed in
ClassWizard.
The following code segments demonstrate both methods, and is to be used with a
MFC ClassWizard-generated IAcadApplication interface.
// This is declared as a member variable in the CSampActiveXClientDlg.
// Given that you've use ClassWizard to import IAcadApplication interface
// from acad.tlb.
![](source/plugin/imc_colorcode/images/loading.gif) - IAcadApplication m_IApp;
- void CSampActiveXClientDlg::OnStartacad()
- {
- // TODO: Add your control notification handler code here
- HRESULT hr = NOERROR;
- CLSID clsid;
- LPUNKNOWN pUnk = NULL;
- LPDISPATCH pDisp = NULL;
- BeginWaitCursor();
- CoInitialize(NULL);
- hr = ::CLSIDFromProgID(L"AutoCAD.Application", &clsid);
- if (SUCCEEDED(hr))
- {
- if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)
- {
- VERIFY(pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pDisp) == S_OK);
- m_IApp.AttachDispatch(pDisp);
- pUnk->Release();
- }
- else
- VERIFY(m_IApp.CreateDispatch(clsid) == TRUE);
- m_IApp.SetVisible(TRUE);
- }
- else
- AfxMessageBox("Acad.Application is not registered!");
- EndWaitCursor();
- }
This code snippet is to be used with #import.
// your location of acad.tlb may vary
#import "c:\acad2k\acad.tlb" raw_interfaces_only, raw_native_types,
no_namespace, named_guids
![](source/plugin/imc_colorcode/images/loading.gif) - CComQIPtr<IAcadApplication, &IID_IAcadApplication> gpApp;
- // start Acad
- HRESULT InitAcad()
- {
- HRESULT hr = S_OK;
- CLSID clsid;
- // get acad running first
- hr = CLSIDFromProgID(L"AutoCAD.Application", &clsid);
- if(FAILED(hr))
- return hr;
- CComPtr<IUnknown> pIUnk;
- hr = GetActiveObject(clsid, NULL, pIUnk);
- if(!pIUnk)
- {
- hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
- IID_IAcadApplication, (void**)&gpApp);
- }
- else
- gpApp = pIUnk;
- if(FAILED(hr) || !gpApp)
- return hr;
- gpApp->put_Visible(VARIANT_TRUE);
- return hr;
- }
|