| 
UID1积分16111精华贡献 威望 活跃度 D豆 在线时间 小时注册时间2002-1-3最后登录1970-1-1 
 | 
 
| 
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 
    
 
 问题:
 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.
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  
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;
}
 
 | 
 |