cag 发表于 2008-4-29 23:07:00

[分享]用DLL加强VBA开发中源程序的保护

本帖最后由 作者 于 2008-4-29 23:11:51 编辑 <br /><br /> <p>做父亲了,一直很忙,好久没来明经了,更是好久没有用VBA写AutoCAD的程序了,昨晚突然心血来潮,想在DLL实现一些关键功能来弥补在VBA开发中源程序不容易保护的缺点,现将“成果”写出来,请大伙不吝拍砖。</p><p>以下调试基于VB6SP6,AutoCAD2005中文版</p><p>1。首先打开VB6,新建一个"Activex Dll"的工程,将产生一个名为“CLASS1”的类,这里将类名改为“TestDll”,并添加引用“AutoCAD2005类型库”</p><p>2。添加一个模块,加入以下代码:</p><p>&nbsp;&nbsp;&nbsp; Public acadApp As AcadApplication<br/>&nbsp;&nbsp;&nbsp; Public ThisDrawing As AcadDocument</p><p>3。添加一个窗体,再在窗体中加入两个button。分别命名为cmdCommand1和cmd,在窗体中加入以下代码:</p><p>Private Sub cmd_Click()<br/>&nbsp;&nbsp;&nbsp; Unload Me<br/>End Sub</p><p>Private Sub cmdCommand1_Click()<br/>&nbsp;&nbsp;&nbsp; Me.Hide<br/>&nbsp;&nbsp;&nbsp; AddLine<br/>&nbsp;&nbsp;&nbsp; Me.Show 1<br/>End Sub</p><p>Private Function AddLine() As AcadLine<br/>&nbsp;&nbsp;&nbsp; Dim pt1 As Variant, pt2 As Variant<br/>&nbsp;&nbsp;&nbsp; pt1 = ThisDrawing.Utility.Getpoint(, "起点:")<br/>&nbsp;&nbsp;&nbsp; pt2 = ThisDrawing.Utility.Getpoint(pt1, "终点:")<br/>&nbsp;&nbsp;&nbsp; Set AddLine = ThisDrawing.ModelSpace.AddLine(pt1, pt2)<br/>&nbsp;&nbsp;&nbsp; AddLine.Update<br/>End Function<br/></p><p>4。在类模块中添加以下代码:</p><p>Public Function Start()<br/>&nbsp;&nbsp;&nbsp; Set ThisDrawing = acadApp.ActiveDocument<br/>&nbsp;&nbsp;&nbsp; Form1.Show 1<br/>End Function</p><p>Private Sub Class_Initialize()<br/>&nbsp;&nbsp;&nbsp; Set acadApp = GetObject(, "AutoCAD.Application.16")<br/>End Sub</p><p>5。将工程属性里将“工程名称”改为“LineCreation”</p><p>6。最后编译生成LineCreation.dll</p><p>接下来要在AutoCAD的VBA中写代码,当然代码越少越好,最好将关建功能代码写在DLL中,以达到保护知识产权的目的。</p><p>7。打开AutoCAD的VBA,引用刚才生成的LineCreation.dll文件,再在ThisDrawing模块中加入以下代码</p><p>&nbsp;&nbsp;&nbsp; Public TestDll As New LineCreation.TestDll</p><p>Sub Test()<br/>&nbsp;&nbsp;&nbsp; TestDll.start<br/>End Sub<br/></p><p>然后运行宏Test即可。</p><p>由上可以看出,只有短短的两句语句,其他需要执行的代码全部封装在DLL文件中,达到了对VBA程序不能很好的进行加密的加强。</p><p>VB源程序已附上 </p>

azjmjsj 发表于 2008-5-3 19:21:00

<p>你这是采用前绑定方式,有一定的局限性。<br/><br/><font color="#000000">采用前绑定时,“工程”--&gt;“引用”的AutoCAD类型库,与AutoCAD版本有很大的关系。有时“引用”AutoCAD2004类型库生成的DLL在AutoCAD2002下可能无法正常运行。(用此种方式,DVB文件需“引用”DLL文件。)<br/>采用后绑定,使用通用的对象类型,不引用具体的类型库,则不受AutoCAD版本的影响,开发的DLL不依赖于AutoCAD的版本,适用于AutoCAD的各个版本。(用此种方式,DVB文件无需“引用”DLL文件。)</font></p><p><font color="#000000"></font></p>

fjfhgdwfn 发表于 2008-5-3 21:16:00

azjmjsj发表于2008-5-3 19:21:00static/image/common/back.gif你这是采用前绑定方式,有一定的局限性。采用前绑定时,“工程”--&gt;“引用”的AutoCAD类型库,与AutoCAD版本有很大的关系。有时“引用”AutoCAD2004类型库生成的DLL在AutoCAD2002下可能无法

<p>可否发个例子上来。学习下。就简单画条线了。</p>

cag 发表于 2008-5-9 11:34:00

azjmjsj发表于2008-5-3 19:21:00static/image/common/back.gif你这是采用前绑定方式,有一定的局限性。采用前绑定时,“工程”--&gt;“引用”的AutoCAD类型库,与AutoCAD版本有很大的关系。有时“引用”AutoCAD2004类型库生成的DLL在AutoCAD2002下可能无法

<p></p><p>呵,那只是个例子了,那就给出个动态引用的例子吧。</p><p>Module1代码:</p><p>&nbsp;&nbsp;&nbsp; Public acadApp As Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;'''声名为object<br/>&nbsp;&nbsp;&nbsp; Public ThisDrawing As Object&nbsp;&nbsp;&nbsp; '''声名为object</p><p>Form1代码:</p><p>Private Sub cmd_Click()<br/>&nbsp;&nbsp;&nbsp; Unload Me<br/>End Sub</p><p>Private Sub cmdCommand1_Click()<br/>&nbsp;&nbsp;&nbsp; Me.Hide<br/>&nbsp;&nbsp;&nbsp; AddLine<br/>&nbsp;&nbsp;&nbsp; Me.Show 1<br/>End Sub</p><p>Private Function AddLine() As Object&nbsp;&nbsp;&nbsp; '''声名为object</p><p>&nbsp;&nbsp;&nbsp; Dim pt1 As Variant, pt2 As Variant<br/>&nbsp;&nbsp;&nbsp; pt1 = ThisDrawing.Utility.GetPoint(, vbCrLf &amp; "起点:")<br/>&nbsp;&nbsp;&nbsp; pt2 = ThisDrawing.Utility.GetPoint(pt1, vbCrLf &amp; "终点:")<br/>&nbsp;&nbsp;&nbsp; Set AddLine = ThisDrawing.ModelSpace.AddLine(pt1, pt2)<br/>&nbsp;&nbsp;&nbsp; AddLine.Update<br/>&nbsp;&nbsp;&nbsp; <br/>End Function</p><p>TestDll代码:</p><p>Public Function start()<br/>&nbsp;&nbsp;&nbsp; Set ThisDrawing = acadApp.ActiveDocument<br/>&nbsp;&nbsp;&nbsp; Form1.Show 1<br/>End Function</p><p>Private Sub Class_Initialize()<br/>&nbsp;&nbsp;&nbsp; Set acadApp = GetObject(, "AutoCAD.Application")&nbsp;&nbsp; '''获取类名<br/>End Sub<br/></p><p>编译</p><p>VBA代码:</p><p>Sub Test()<br/>&nbsp;&nbsp;&nbsp; Dim TestDll As Object<br/>&nbsp;&nbsp;&nbsp; Set TestDll = CreateObject("LineCreation.TestDll")<br/>&nbsp;&nbsp;&nbsp; TestDll.start<br/>End Sub</p><p>这样运行即可</p>

kingchoice00 发表于 2008-7-30 18:51:00

<p>我来顶你啊。好好!!!!!!!!!!!!!!!!!!!!!!!!!!111</p>

MJTD_7777 发表于 2008-7-31 09:42:00

<p>"动态引用”也不是太好。</p><p>输入的时候后面不会有提示。</p>

xxxtttxxx 发表于 2008-8-3 13:38:00

<p>楼上可以先引用写程序,</p><p>写完后修改一下动态引用不就好了吗?</p>

leo_zp_yang 发表于 2008-8-14 13:56:00

去试一下先,就是不知道关于CAD对象的调用是否可以提前在VB中指定.

idoo 发表于 2008-8-17 21:56:00

<p>高,实在佩服!拜读中!!!</p>

yhjyhjyhj 发表于 2010-10-26 20:21:00

<p>该方法做的dll 在打开多个cad中窗口中,只能第一个可行,其它不能用,为什么??</p>
页: [1] 2
查看完整版本: [分享]用DLL加强VBA开发中源程序的保护