乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 178|回复: 9

【越飞越高】COM编程初探

[复制链接]

117

主题

608

帖子

19

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1625
发表于 2012-8-24 14:01:00 | 显示全部楼层 |阅读模式
尝试COM编程,和大家共同探讨一下,并交流一下自己的心得。
COM编程,实用范围广,它绝大部分可以运行于CAD的各个版本,运行效率高,因为是用VC++编写,故而程序的加密性也很好。
这里是我的示例流程:
1.首先用创建一个MFC的对话框工程,勾选Automation,其他按照默认来。
2.设计好对话框界面,增加一个ComboBox控件,用来选择CAD版本,并为之附加一个成员变量m_ctrVersion;
  再增加两个按钮。详细过程不表。
3.在工程中增加一个类,选择MFC Class From TypeLib类。
  从中选择文件或注册表的,都可以,我这里选择了文件,acad.tlb --这个是 2002的接口类。
  你也可以选其他版本,譬如,acax16chs.tlb ,acax17enu.tlb之类。  这里只是为照顾低版本的,有可能会有极少数的几
个函数低版本不支持。

pcaci1vljao.jpg

pcaci1vljao.jpg

4.接口中选择你需要的类,譬如我只选择了跟这个工程有关的几个:
CAcadApplication,CAcadDocuments,CAcadDocument,CAcadModelSpace,CAcadUtility
也是最常用的几个了。增加的工程中,向导为你自动生成头文件。可能你要对CAcadUtility.h文件稍做修改,才能编译运行

xxdaiipik5c.jpg

xxdaiipik5c.jpg


5.在stdafx.h中添加:
  1. #include "CAcadDocument.h"
  2. #include "CAcadDocuments.h"
  3. #include "CAcadApplication.h"
  4. #include "CAcadModelSpace.h"
  5. #include "CAcadUtility.h"

6.在对话框的头文件COMSampleDlg.h中添加几个变量:
  1. CAcadApplication m_cadApp;
  2. CAcadDocument m_Doc;

7.至次,准备工作完成。
8.连接到CAD中的代码部分如下:
  1. void CCOMSampleDlg::OnBnClickedLinktoCAD()
  2. {
  3. if (m_cadApp != NULL ) m_cadApp.DetachDispatch();
  4. CLSID clsid;
  5. HRESULT hr = CLSIDFromProgID(m_version,&clsid);
  6. IUnknown *m_pUnkn = NULL;
  7. IDispatch *m_pDisp = NULL;
  8. if (GetActiveObject(clsid, NULL,&m_pUnkn) == S_OK)      //if
  9. (GetActiveObject(__uuidof(AcadApplication), NULL,&m_pUnkn) != S_OK)
  10.   if (m_pUnkn->QueryInterface(IID_IDispatch, (void**)&m_pDisp) == S_OK)
  11.    m_cadApp.AttachDispatch(m_pDisp);
  12. if (m_cadApp == NULL)
  13. {
  14.   m_cadApp.CreateDispatch(m_version);
  15.   if (m_cadApp == NULL)
  16.   {
  17.    AfxMessageBox(LoadStringFromID(IDS_ATTACHFAILURE));
  18.    return;
  19.   }
  20. }
  21. }

思路是,如果你选择版本的CAD在运行,则连接,否则从创建一个CAD实例程序。由此建立程序与CAD的连接和通信。
9.画图部分代码我省略掉了。
  大致流程如下,前面的连接到CAD已经得到程序的实例CAcadApplication  m_cadApp;
  由此得到当前文档m_Doc = m_cadApp.get_ActiveDocument();
  再得到模型空间实例,CAcadModelSpace  modelSpace = m_Doc.get_ModelSpace();
  在此空间中创建一条轻多段线,放大这条线段。
  最后是与用户交互创建一条直线。
  其中有一个难点题目,就是如和传递可选参数,这个问题困惑了我好几天。后来终于在国外找到答案。
参见:
当调用具有从 Visual c + + 的可选参数的方法时,您不能省略了可选参数。您需要改为传递一个特殊的变量。
某些方法具有"可选"参数。在 Visual Basic,则可以省略它们调用该方法时。但是,当使用 Visual c + + 调用时,必须
传递特殊变量的.vt 字段具有值 VT_ERROR 和.scode 字段具有值 DISP_E_PARAMNOTFOUND。这就是:
  1.       
  2. // VARIANT used in place of optional-parameters.
  3. VARIANT varOpt;
  4. varOpt.vt = VT_ERROR;
  5. varOpt.scode = DISP_E_PARAMNOTFOUND;

10.在CAD中测试运行。呵呵,因为仅仅是示例,所以有些地方的并没有catch 处理。商业化软件应该要处理的。

                               
登录/注册后可看大图


好,为你介绍到这里。本人水平有限,在此献丑了,大家有什么好的办法和建议拿出来哦。
工程源码附后。
附注:为了使得编译后的工程有广泛性,需编译的时候选择静态库。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2012-8-24 18:28:00 | 显示全部楼层
先占个位,有空再来学习...
回复

使用道具 举报

2

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
15
发表于 2012-8-24 22:18:00 | 显示全部楼层
,紧跟脚步,占位
回复

使用道具 举报

5

主题

88

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
108
发表于 2012-8-27 19:56:00 | 显示全部楼层
看看,嘿嘿,待会看看效果
回复

使用道具 举报

5

主题

88

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
108
发表于 2012-8-27 20:11:00 | 显示全部楼层
没有COM的基础,没弄出来,
回复

使用道具 举报

14

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
156
发表于 2012-11-1 18:26:00 | 显示全部楼层
不错,谢谢LZ提供。
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2013-1-27 01:04:00 | 显示全部楼层

mark,com是个高级货,日后备用,多谢楼主
回复

使用道具 举报

2

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
13
发表于 2013-2-1 16:23:00 | 显示全部楼层
mark 有的时候还真得用下com 不过com的数据类型整起来太麻烦了
回复

使用道具 举报

4

主题

34

帖子

8

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2013-4-11 19:40:00 | 显示全部楼层
学习了,感谢!
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2014-4-10 00:42:00 | 显示全部楼层
请问在COM编程中怎么设置cad里文本的字体和颜色
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-4-30 13:20 , Processed in 2.257074 second(s), 90 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表