-
我们在使用VBA的时候会很多的局限性,包括调用库和递归函数,对指针结构体和类都不友好,对时间复杂度和空间复杂度都优化得不够,换言之VB就不是从性能出发的语言,所以难免力不从心
-
所以这里
用C++为VBA做DLL(动态链接库)
. 可能有的小伙伴就要问了,直接给CDR做动态链接库不是直接了当吗? 是的,直接给CDR做基于MFC的动态链接库是很好,但是纯C++很麻烦,费时间,要编译,要重启CDR,要找BUG, 而同样的功能VBA大部分可以实现,所以我只在
核心的
或
对性能有要求的
或
只有C++才能方便实现的
功能上使用C++. 简而言之就是
VBA能容易做到就用VBA,复杂部分用C++
. 这样结合是很合理很轻松的方式.有图有真相,先上图:
-
使用
半VBA半C++
的方式有哪些优点呢? -
1
构思节省时间 -
2
能做强大功能 -
3
避开全体编译 -
4
用VBA调用C++天经地义,两种并行各取所长 -
5
测试DLL过程中
无需重启CDR
–对使用CDR工作中的人非常友好, -
使用
LoadLibrary
动态调用DLL的方式比静态调用
declare
的方式更加灵活,内存在使用完DLL之后即对这个文件进行释放,方便随时升级更新动态链接库.这也是第5条得以实现的原因.
当然
毫无基础的同学也同样可以照做
,因为只要你代码写对了就可以实现,不需要全部理解,好了废话不多说了,下面开始准备工作:
-
首先需要一个C++工作环境,也就IDE集成开发环境,各有所好,推荐使用VS2019社区版,英文全称
Microsoft Visual Studio Community 2019
.社区版是免费的只要登陆就可以正常使用,不要下载专业版要收费的哦,记得安装完成之后
安装组件就对照我下面的图片即可
具体过程实在不熟悉的朋友可以去百度一下专门介绍安装问题的.
-
后面这张单个组件中的
v142
是如果你要用纯C++开发插件必装的组件,你可装可不装,为了避免出现问题就装一下吧,
Help Viewer
是开发者手册,里面的手册能装尽量全部装了,这样有问题一搜比较好找问题.
- 好了你只要把这个装好了就可以进入下一步了
为了避免平台限流我还是把刚才GIF里面的代码上一下,以下代码可以不用看
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "User32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Public Sub Command1_Click()
On Error Resume Next
Dim lb As Long, pa As Long
lb = LoadLibrary("c:\cine\CongLingKaiShi_YinYong.dll") '加载动态连接库
pa = GetProcAddress(lb, "WoDeDll") '取得库中的函数地址
pa = CallWindowProc(pa, ByVal VarPtr(CorelDRAW.Application), ByVal CorelDRAW.Windows.Item(1).Handle, ByVal 0&, ByVal 0&) '调用函数并传入四个参数
FreeLibrary lb '释放
End Sub