找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1238|回复: 8

[VBA程序]:VC里也能用autocad的automation来编程么

[复制链接]
发表于 2002-7-8 10:27:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
VB在编制AutoCAD时,用的是ACAD.TLB,而我想,既然vb可以,vc也肯定可以。所以就把
ACAD.TLB倒成idl,然后生成了ACAD_I.h和ACAD_c.h,然后我写了下面的代码:
  
IID_PROGID是CLSID。
  
    if(FAILED(OleInitialize(NULL)))
    {
        return ;
    }
    IAcadApplication *pIApp = NULL ;
    HRESULT hr = ::CoCreateInstance(IID_PROGID ,
        NULL,
        CLSCTX_ALL,
        IID_IAcadApplication ,
        (LPVOID*)&pIApp);
    if(FAILED(hr))
    {
        int i;

        i = 0;
        _com_error err(hr);
        AfxMessageBox(err.ErrorMessage());
    }
可是就是不成功,MessageBox的提示是:一般性拒绝访问错误。hr = -2147467262
问,我该怎么办。随便提及,是不是要生成一个代理dll才行?如果是要,同tlb文件什
么生成?生成了又如何使用?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-7-14 00:37:12 | 显示全部楼层

Re: [VBA程序]:[VBA程序]:VC里也能用autocad的automation来编程么

最初由 bookworm_zju 发布
[B]VB在编制AutoCAD时,用的是ACAD.TLB,而我想,既然vb可以,vc也肯定可以。所以就把
ACAD.TLB倒成idl,然后生成了ACAD_I.h和ACAD_c.h,然后我写了下面的代码:
  
IID_PROGID是CLSID。
  
    if(FAILED(OleI... [/B]


回答是肯定的。

如果你使用MFC, 你可以利用ClassWizard来生成一组接口类。在ClassWizard中选AddClass并点取From a Type Library菜单,选acad.tlb,然后在Confirm Classes中选取你感兴趣的接口类即可。ClassWizard会自动从类型库中输入这些接口并生成相应的C++ class。

如果你不用MFC直接用COM, 可能麻烦点. 建议用MFC

更好的建议是直接用ObjectARX.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-14 09:13:30 | 显示全部楼层
我按照你的办法做了,可是还是达不到目的:
办法一:        IAcadApplication *pIApp = NULL;
        CLSID clsid;
        if ( FAILED(::CLSIDFromProgID( L"AutoCAD.Application.14",&clsid) ) )
        {
                return ;
        }
        const IID IID_IAcadApplication = {0x372FA490,0x600C,0x11CF,{0x93,0xEB,0x08,0x00,0x09,0x9E,0xB3,0xB7}};                       
        HRESULT hr = ::CoCreateInstance( clsid,NULL,CLSCTX_ALL,IID_IAcadApplication,(void**)pIApp);

办法二:把autocad先打开,然后
        IAcadApplication *pIApp = NULL;
        CLSID clsid;
        if ( FAILED(::CLSIDFromProgID( L"AutoCAD.Application.14",&clsid) ) )
        {
                return ;
        }

        LPUNKNOWN pUnk=NULL;
        ::GetActiveObject(clsid,NULL,&pUnk);//这步是正确的
        HRESULT hr = pUnk->QueryInterface( IID_IAcadApplication, (void**)pIApp);
hr的返回值的意思大概是,该接口不存在。我查了一下注册表,好象确实找不到该接口.........是不是我用的的14而不是2000的缘故呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-14 11:06:29 | 显示全部楼层
老兄为什么不用智能接口指针来访问呢?CComPtr <AcadApplication>  pIApp;
pIApp.CreateInstance(__uuidof(AcadApplication));即可创建对象
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-14 19:02:51 | 显示全部楼层
老兄,不行呀
我程序如下:
        CComPtr<IAcadApplication> pIApp;
        HRESULT hr = pIApp.CoCreateInstance(__uuidof(IAcadApplication));
后来,我改成:
        CLSID clsid;
        if ( FAILED(::CLSIDFromProgID( L"AutoCAD.Application.14",&clsid) ) )
        {
                return ;
        }
        HRESULT hr = pIApp.CoCreateInstance(clsid));
创建了一个acad进程,可是,还是无法获取该接口。我估计是因为我的定义错了。应该定义成什么呢?
CComPtr<?????????????????> pIApp;
老兄,可不可以帮我编编看?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-14 20:29:43 | 显示全部楼层
老兄,在调用
CoCreateInstance()
之前一定要调用
CoInitialize(NULL);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-14 20:44:53 | 显示全部楼层
用MFC&ClassWizard

  1. BOOL CAcadTestDlg::OnInitDialog()
  2. {
  3.     //....
  4.     CoInitialize(NULL);
  5.     return TRUE;  // return TRUE  unless you set the focus to a control
  6. }
  7. void CAcadTestDlg::OnButton1()
  8. {
  9.     // TODO: Add your control notification handler code here
  10.     IAcadApplication IApp;
  11.     HRESULT hr = NOERROR;
  12.     CLSID clsid;
  13.     LPDISPATCH pAcadDisp = NULL;
  14.        
  15.     hr = ::CLSIDFromProgID(L"AutoCAD.Application", &clsid);
  16.     if (SUCCEEDED(hr))
  17.     {
  18.       hr = ::CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,IID_IDispatch,(LPVOID *)&pAcadDisp);
  19.       if (SUCCEEDED(hr)){
  20.           IApp.AttachDispatch(pAcadDisp);
  21.           IApp.SetVisible(true);
  22.       }
  23.     }

  24. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-14 21:52:49 | 显示全部楼层
感谢感谢!

可是为什么我调用IApp.SetVisible(true)时,出现错误,提示如下:停用了“调用取消”
这是为什么呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-21 00:29:17 | 显示全部楼层
put_Visible(true);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-3 11:24 , Processed in 0.198725 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表