- 上一节中我们生成了标准的DLL文件,那么就到了最关键的时候了,我们接下来回到VBA中,开始我们的静态调用吧
- 我们先添加一个模块
'静态调用
Public Declare Function wodedll Lib "E:\VS-DLL\conglingkaishi\Debug\CongLingKaiShi.dll" Alias "WoDeDll" (ByVal Application As Application, ByVal hwnd As Long) As Integer
-
这是声明,
Public
是可供模块之外访问的意思,是共开的 -
然后
Declare Function
或者是sub这个是固定用法,Function 后面接我们的功能函数的名称,这里写上wodedll -
名称后面接
Lib
是固定用法,不管是加载的lib还是dll都是这个,然后后面再接需要被声明的库文件"E:\VS-DLL\conglingkaishi\Debug\CongLingKaiShi.dll"这个就是我们上一节上制作好的dll文件. -
Alias
是在里面查找功能函数,"WoDeDll"
这个就是我们在C++程序中命名的函数名 -
ByVal Application As Application
这里是传第一个参数,是一个Application类,实际上它里也就是一个地址指针,指向这个类 -
ByVal hwnd As Long
这是第二个参数,传的是一个窗口句柄,它实际上也就是一个长整数,所以用的long -
为什么要传这两个参数呢,因为我们的DLL只要有了这两个参数,或者说只要有了第一个参数就能对我们的CDR程序进行操作,因为CDR所有的子类基本都可以通过这个
Application
基类进行访问.它甚至可以说不是继承关系,而是封装的关系.里面的类一层一层封装在Application中. -
好了,我们进入到A文件中进行调用
Sub 第一个插件()
vbaToDll.wodedll CorelDRAW.Application, CorelDRAW.Windows.Item(1).Handle
End Sub
- 好了,我们看一下最终效果如何
- 成功了
- 刚才传的两个参数,一个是
CorelDRAW.Application
, - 另一个是
CorelDRAW.Windows.Item(1).Handle
这个就是主窗口的句柄值.用来模态弹窗用的 - 好了,调用成功,但是为什么说静态调用不好呢,我们这个时候可以回到
CongLingKaiShi.dll
这个文件看一下,当我们直接移动或者删除或者覆盖的时候会提示错误
这也就是为什么我要选择用动态调用的原因,下一节讲动态调用