从exe向intellicad&autocad发消息的方法

1. 向intellicad发消息:

#include "stdafx.h" 
#include "atlbase.h" 
#include "IcadTLB.h" //<-- you can find this in the API directory 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
  //init 
  CoInitialize(NULL); 

  //get the application 
  CComPtr
  
   application = NULL; 
  CLSID   applicationClass; 
  CLSIDFromProgID( OLESTR("icad.application"), &applicationClass ); 

  CComPtr
  
     unknown; 
  HRESULT result =  GetActiveObject( applicationClass, NULL, &unknown ); 
  if( SUCCEEDED( result ) ) 
  { 
    CComQIPtr
  
     app = unknown; 
    application = app; 
  } 
  else 
  { 
    printf("Failed to get Application"); 
    return -1; 
  } 

  //get the active document.. not needed here, but left it in as an example 
  CComPtr
  
   document; 
  HRESULT hr = application->get_ActiveDocument( &document ); 
  if(FAILED(hr)) 
  { 
    printf("Failed to get active document"); 
    return -1; 
  } 

  //make our BSTR 
  BSTR bstrScript = SysAllocString(L"C:/Spline.scr"); 

  //run the sript 
  hr = application->RunScript(bstrScript); 
  if(FAILED(hr)) 
  { 
    printf("Failed to run script"); 
  } 

  SysFreeString(bstrScript); 

  return 0; 
} 
 
以上代码由www.intellicadms.com提供。
2.autocad
 	#include "acad.h"
#include <comdef.h>
 
	IAcadApplication * pApp = NULL ;
	IAcadDocument *pDoc = NULL ;
	CLSID clsid ;
	HRESULT hr = NOERROR ;
   	 LPUNKNOWN pUnk = NULL ;
    	LPDISPATCH pAcadDisp = NULL ;
	BSTR BCmdStr = NULL ;
	
	string command = "SCR " + workfolder + "//test.SCR" + "/n";

	try
	{
		CoInitialize(NULL);
		pApp = new IAcadApplication() ;
		if ( FAILED(::CLSIDFromProgID( L"AutoCAD.Application",&clsid) ))
			throw 1 ;
		if(::GetActiveObject(clsid , NULL , &pUnk) != S_OK)
			throw 2 ;
		if(pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pAcadDisp) != S_OK)
			throw 3 ;
		
		pApp ->AttachDispatch(pAcadDisp) ;
		
		// 		if ( FAILED(::CLSIDFromProgID( L"AutoCAD.Application",&clsid) ))
		// 			throw 4 ;
		// 		if(::GetActiveObject(clsid , NULL , &pUnk) != S_OK)
		// 			throw 5 ;
		// 		if(pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pAcadDisp) != S_OK)
		// 			throw 6 ;
		
		pDoc = new IAcadDocument() ;
		LPDISPATCH pp = pApp ->GetActiveDocument() ;
		pDoc ->AttachDispatch(pp) ;
//		if(pop)
			::BringWindowToTop(::GetParent(::GetParent((HWND)pDoc ->GetHwnd()))) ;
		//BCmdStr = CComBSTR(cmdStr);
		// 		BCmdStr = ::SysAllocString(cmdStr) ;
		// 		pDoc ->SendCommand((LPCTSTR)BCmdStr) ;
		pDoc->SendCommand("FILEDIA 0 ");
		pDoc->SendCommand(command.c_str());

//		pDoc ->SendCommand(cmdStr) ;
		delete pDoc ;
		delete pApp ;
		pUnk->Release() ;
		//::SysFreeString(BCmdStr) ;
		CoUninitialize() ;
	}
	catch (_com_error * e)
	{
		if(pApp != NULL)
			delete pApp ;
		if(pDoc != NULL)
			delete pDoc ;
		if(BCmdStr != NULL)
			::SysFreeString(BCmdStr) ;
		if(pUnk != NULL)
			pUnk ->Release() ;
		AfxMessageBox(e ->ErrorMessage()) ;
		return -1 ;
	}
	catch (int e)
	{
		if(pApp != NULL)
			delete pApp ;
		if(pDoc != NULL)
			delete pDoc ;
		if(BCmdStr != NULL)
			::SysFreeString(BCmdStr) ;
		if(pUnk != NULL)
			pUnk ->Release() ;
//		AfxMessageBox(_T("ERROR num e")) ;
		return -1 ;
	}
	
 
	

	return 1 ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值