guohq 发表于 2010-6-3 23:46:00

VB引用CAD类库

<p>做了一个CAD批处理程序,可以让用户选择哪CAD版本来做批处理,目前程序引用的是AutoCAD 2005 Type Library,如果选择非2005版本,在运行过程中会出错。</p>
<p>&nbsp;</p>
<p>请问如果在程序中通过代码方式来引用某个类库,这样引用的类库能各启动的CAD版本相匹配,而不要通过菜单方式来引用;</p>
<p></p>

pmq 发表于 2018-10-8 16:09:22

新鲜8 发表于 2018-10-5 10:20
能说的详细点吗怎么做的3个dll文件吗

就是在引用CAD类型库时分别引用CAD2006,CAD2009,CAD2012

源代码:http://bbs.mjtd.com/thread-176758-1-1.html

http://bbs.mjtd.com/thread-176759-1-1.html

新鲜8 发表于 2018-10-5 10:20:31

pmq 发表于 2010-7-4 14:38
我的“测量成图剖面计算”也是这样,做三个DLL,分别引用2006,2009,2011
Public Sub CadVer()&nbsp;&nbsp; ...

能说的详细点吗怎么做的3个dll文件吗

爱丹 发表于 2018-5-16 17:24:37

guohq 发表于 2010-7-3 19:53
目前我已经试验成功,做三个DLL,分别引用2002 ,2006 ,2009Type Library,然后新建一个工程,此工程得引用刚 ...

那是不是得装多个版本的cad?

wylong 发表于 2010-6-4 11:15:00

后期绑定类型库

guohq 发表于 2010-6-4 11:41:00

请问能介绍一下怎么绑定吗?

wylong 发表于 2010-6-4 14:05:00

1、如何在 VB 中连接 AutoCAD。<br/>启动 VB ,引用 AutoCAD 类型库。操作步骤:从“工程”菜单中选择“引用”选项,启动“引用”对话框。在“引用”对话框中,选择 AutoCAD 类型库,然后单击“确定”。<br/><br/>定义模块级变量 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc)。<br/>如果 AutoCAD 正在运行,使用 GetObject 函数将检索 AutoCAD Application 对象。如果 AutoCAD 没有运行,使用 CreateObject 函数试图创建一个 AutoCAD Application 对象。如果创建成功,会启动 AutoCAD;如果失败,则会发生错误。<br/>同时运行多个 AutoCAD 任务时,GetObject 函数会返回 Windows 运行对象表中的第一个 AutoCAD 实例。<br/>要显示 AutoCAD 图形窗口,需要将 AutoCAD 应用程序的 Visible 特性设置为 TRUE。<br/>使用 acadDoc 变量引用当前的 AutoCAD 图形。<br/>示例:<br/>Dim acadApp As AcadApplication<br/>Dim acadDoc as AcadDocument<br/>Sub ConnectToAcad()<br/><br/>On Error Resume Next<br/>Set acadApp = GetObject(, "AutoCAD.Application")<br/>If Err Then<br/>Err.Clear<br/>Set acadApp = CreateObject("AutoCAD.Application")<br/>If Err Then End<br/>End If<br/>acadApp.Visible = True<br/>Set acadDoc = acadApp.ActiveDocument<br/>End Sub<br/><br/>2、如何使 VB 开发的程序不依赖于 AutoCAD 的版本。<br/>启动 VB ,定义模块级变量 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc)。<br/>如果 AutoCAD 正在运行,使用 GetObject 函数将检索 AutoCAD Application 对象。如果 AutoCAD 没有运行,使用 CreateObject 函数试图创建一个 AutoCAD Application 对象。如果创建成功,会启动 AutoCAD;如果失败,则会发生错误。<br/>同时运行多个 AutoCAD 任务时,GetObject 函数会返回 Windows 运行对象表中的第一个 AutoCAD 实例。<br/>要显示 AutoCAD 图形窗口,需要将 AutoCAD 应用程序的 Visible 特性设置为 TRUE。<br/>使用 acadDoc 变量引用当前的 AutoCAD 图形。<br/>示例:<br/>Dim acadApp As Object<br/>Dim acadDoc as Object<br/>Sub ConnectToAcad()<br/><br/>On Error Resume Next<br/>Set acadApp = GetObject(, "AutoCAD.Application")<br/>If Err Then<br/>Err.Clear<br/>Set acadApp = CreateObject("AutoCAD.Application")<br/>If Err Then End<br/>End If<br/>acadApp.Visible = True<br/>Set acadDoc = acadApp.ActiveDocument<br/>End Sub<br/>与第一个问题相比较,可以看出,不引用具体的类型库以及使用通用的对象类型就可以达到通用性。<br/><br/>3、前期绑定和后期绑定<br/>要创建一个使用前期绑定方式的对象变量,也就是说,在程序编译时就完成绑定,则对象变量在声明时应指定类 ID,如:Dim acadApp As AcadApplication。<br/>使用 As Object 子句声明对象变量,可以创建一个能包含任何类型对象引用的变量。不过,该变量访问对象是后期绑定的,也就是说,绑定在程序运行时才进行,如:Dim acadApp As Object。<br/>前期绑定的变量引用可以提供更好的性能,但该变量只能存放声明中所指定的类的引用。<br/>而后期绑定的变量引用可以提供更好的通用性。<br/><br/>4、依赖于版本和独立于版本<br/>如果 CreateObject 或 GetObject 函数使用的 ProgID 没有附加版本号,那么是独立于版本的,否则是依赖于版本的。例如,如果使用的是 CreateObject,则 CreateObject ("AutoCAD.Application") 是独立于版本的,而 CreateObject ("AutoCAD.Application.15") 是依赖于版本的。

guohq 发表于 2010-6-7 09:05:00

<p>这种方法做起来没那么理想,因为我想指定启动某个版本,即使在application后面加了版本号,也不方便控制。</p>
<p>用CreateObject(AutoCAD.Application)加版本号不行。</p>
<p>比如 我当前引用了2008的类库,生成exe文件后,复制到其它电脑上,而目标电脑上只装了2005,通过shell函数启动CAD2005,当程序运行到getobject时,便会出错。</p>
<p>&nbsp;</p>

guohq 发表于 2010-6-7 17:11:00

<p>假如系统已经安装了AutoCAD2004 2005 2006 ,通过<font face="Verdana">CreateObject("autocad.application.16.1")不一定能启动CAD2005,而是启动了系统最后一次启动的版本,怎样能控制CAD启动的版本呢?</font></p>

xiaowen 发表于 2010-6-9 15:48:00

<p>很感谢楼主分享,多谢了.</p>

guohq 发表于 2010-7-3 19:53:00

目前我已经试验成功,做三个DLL,分别引用2002 ,2006 ,2009Type Library,然后新建一个工程,此工程得引用刚才生成的三个DLL,这样就不会出错版本间的冲突,

pmq 发表于 2010-7-4 14:38:00

<p>我的“测量成图剖面计算”也是这样,做三个DLL,分别引用2006,2009,2011</p>
<p><font face="Verdana"><font face="Verdana">Public Sub CadVer()<br/>&nbsp;&nbsp;&nbsp; strAcadVersion = Application.Version<br/>&nbsp;&nbsp;&nbsp; strAcadVersion = Left(strAcadVersion, 4)<br/>&nbsp;&nbsp;&nbsp; Select Case strAcadVersion<br/>&nbsp;&nbsp;&nbsp; Case "16.0", "16.1", "16.2"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set SurA = CreateObject("SurFun200456.Class1")<br/>&nbsp;&nbsp;&nbsp; Case "17.0", "17.1", "17.2"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set SurA = CreateObject("SurFun200789.Class1")<br/>&nbsp;&nbsp;&nbsp; Case "18.0", "18.1", "18.2"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set SurA = CreateObject("SurFun20101.Class1")<br/>&nbsp;&nbsp;&nbsp; Case Else<br/>&nbsp;&nbsp;&nbsp; End Select<br/>End Sub<br/>根据CAD版本调用相应的DLL文件。</font></font></p>
<p>&nbsp;</p>
<p><font face="Verdana"><a href="http://pmq.ys168.com/">http://pmq.ys168.com/</a></font></p>

fuhuodao 发表于 2015-8-7 23:12:21

做三个DLL,分别引用2002 ,2006 ,2009Type Library,,,能不能说的更详细点吗
页: [1] 2
查看完整版本: VB引用CAD类库