明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6548|回复: 18

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

  [复制链接]
发表于 2008-4-29 23:07:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-4-29 23:11:51 编辑

做父亲了,一直很忙,好久没来明经了,更是好久没有用VBA写AutoCAD的程序了,昨晚突然心血来潮,想在DLL实现一些关键功能来弥补在VBA开发中源程序不容易保护的缺点,现将“成果”写出来,请大伙不吝拍砖。

以下调试基于VB6SP6,AutoCAD2005中文版

1。首先打开VB6,新建一个"Activex Dll"的工程,将产生一个名为“CLASS1”的类,这里将类名改为“TestDll”,并添加引用“AutoCAD2005类型库”

2。添加一个模块,加入以下代码:

    Public acadApp As AcadApplication
    Public ThisDrawing As AcadDocument

3。添加一个窗体,再在窗体中加入两个button。分别命名为cmdCommand1和cmd,在窗体中加入以下代码:

Private Sub cmd_Click()
    Unload Me
End Sub

Private Sub cmdCommand1_Click()
    Me.Hide
    AddLine
    Me.Show 1
End Sub

Private Function AddLine() As AcadLine
    Dim pt1 As Variant, pt2 As Variant
    pt1 = ThisDrawing.Utility.Getpoint(, "起点:")
    pt2 = ThisDrawing.Utility.Getpoint(pt1, "终点:")
    Set AddLine = ThisDrawing.ModelSpace.AddLine(pt1, pt2)
    AddLine.Update
End Function

4。在类模块中添加以下代码:

Public Function Start()
    Set ThisDrawing = acadApp.ActiveDocument
    Form1.Show 1
End Function

Private Sub Class_Initialize()
    Set acadApp = GetObject(, "AutoCAD.Application.16")
End Sub

5。将工程属性里将“工程名称”改为“LineCreation”

6。最后编译生成LineCreation.dll

接下来要在AutoCAD的VBA中写代码,当然代码越少越好,最好将关建功能代码写在DLL中,以达到保护知识产权的目的。

7。打开AutoCAD的VBA,引用刚才生成的LineCreation.dll文件,再在ThisDrawing模块中加入以下代码

    Public TestDll As New LineCreation.TestDll

Sub Test()
    TestDll.start
End Sub

然后运行宏Test即可。

由上可以看出,只有短短的两句语句,其他需要执行的代码全部封装在DLL文件中,达到了对VBA程序不能很好的进行加密的加强。

VB源程序已附上

本帖子中包含更多资源

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

x
发表于 2008-5-3 19:21:00 | 显示全部楼层

你这是采用前绑定方式,有一定的局限性。

采用前绑定时,“工程”-->“引用”的AutoCAD类型库,与AutoCAD版本有很大的关系。有时“引用”AutoCAD2004类型库生成的DLL在AutoCAD2002下可能无法正常运行。(用此种方式,DVB文件需“引用”DLL文件。)
采用后绑定,使用通用的对象类型,不引用具体的类型库,则不受AutoCAD版本的影响,开发的DLL不依赖于AutoCAD的版本,适用于AutoCAD的各个版本。(用此种方式,DVB文件无需“引用”DLL文件。)

发表于 2008-5-3 21:16:00 | 显示全部楼层
azjmjsj发表于2008-5-3 19:21:00你这是采用前绑定方式,有一定的局限性。采用前绑定时,“工程”-->“引用”的AutoCAD类型库,与AutoCAD版本有很大的关系。有时“引用”AutoCAD2004类型库生成的DLL在AutoCAD2002下可能无法

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

 楼主| 发表于 2008-5-9 11:34:00 | 显示全部楼层
azjmjsj发表于2008-5-3 19:21:00你这是采用前绑定方式,有一定的局限性。采用前绑定时,“工程”-->“引用”的AutoCAD类型库,与AutoCAD版本有很大的关系。有时“引用”AutoCAD2004类型库生成的DLL在AutoCAD2002下可能无法

呵,那只是个例子了,那就给出个动态引用的例子吧。

Module1代码:

    Public acadApp As Object         '''声名为object
    Public ThisDrawing As Object    '''声名为object

Form1代码:

Private Sub cmd_Click()
    Unload Me
End Sub

Private Sub cmdCommand1_Click()
    Me.Hide
    AddLine
    Me.Show 1
End Sub

Private Function AddLine() As Object    '''声名为object

    Dim pt1 As Variant, pt2 As Variant
    pt1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "起点:")
    pt2 = ThisDrawing.Utility.GetPoint(pt1, vbCrLf & "终点:")
    Set AddLine = ThisDrawing.ModelSpace.AddLine(pt1, pt2)
    AddLine.Update
   
End Function

TestDll代码:

Public Function start()
    Set ThisDrawing = acadApp.ActiveDocument
    Form1.Show 1
End Function

Private Sub Class_Initialize()
    Set acadApp = GetObject(, "AutoCAD.Application")   '''获取类名
End Sub

编译

VBA代码:

Sub Test()
    Dim TestDll As Object
    Set TestDll = CreateObject("LineCreation.TestDll")
    TestDll.start
End Sub

这样运行即可

发表于 2008-7-30 18:51:00 | 显示全部楼层

我来顶你啊。好好!!!!!!!!!!!!!!!!!!!!!!!!!!111

发表于 2008-7-31 09:42:00 | 显示全部楼层

"动态引用”也不是太好。

输入的时候后面不会有提示。

发表于 2008-8-3 13:38:00 | 显示全部楼层

楼上可以先引用写程序,

写完后修改一下动态引用不就好了吗?

发表于 2008-8-14 13:56:00 | 显示全部楼层
去试一下先,就是不知道关于CAD对象的调用是否可以提前在VB中指定.
发表于 2008-8-17 21:56:00 | 显示全部楼层

高,实在佩服!拜读中!!!

发表于 2010-10-26 20:21:00 | 显示全部楼层

该方法做的dll 在打开多个cad中窗口中,只能第一个可行,其它不能用,为什么??

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 11:23 , Processed in 0.170342 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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