|
本帖最后由 ganlinlao 于 2013-11-3 09:46 编辑
DirectCOM 是个好东西!有了它,你就可以使用VBA直接从ActiveX DLL文件创建对象,这意味着用office的VBA可以
开发后期绑定的插件,而不需通过RegSvr32命令对该DLL文件进行注册,不需直接引用该DLL。
使用方法:
1、 把DirectCOM.dll 复制到你所写的access程序目录中,或system目录
2、在你的vba模块中建立一个 DirectCOM.bas的模块。
3、先使用 DirectCom_Load() 加载DLL,并获取句柄
4、使用 DirectCom_Create() 创建对象(注意该对象为Object类型)
5、最后使用 DirectCom_Free() 释放DLL
就这么简单!
DirectCom.bas的代码如下:
'@说明 加载动态链接库
'@参数 动态链接库文件名
'@返回值 成功返回句柄,失败返回0
Public Declare Function DirectCom_Load Lib "kernel32" Alias "LoadLibraryA" ( _
ByVal lpLibFileName As String _
) As Long
'@说明 释放动态链接库
'@参数 动态链接库句柄
'@返回值 非0表示成功,0表示失败
Public Declare Function DirectCom_Free Lib "kernel32" Alias "FreeLibrary" ( _
ByVal hLibModule As Long _
) As Long
'@说明 直接从ActiveX DLL文件创建COM对象
'@参数 ActiveX DLL 文件名
'@参数 类名
'@返回值 成功返回类的实例,失败返回Nothing
Public Declare Function DirectCom_Create Lib "DirectCOM" Alias "GETINSTANCE" ( _
FName As String, _
className As String _
) As Object
'@说明 获取DirectCOM最近的错误信息
'@返回值 错误信息文本
Public Declare Function DirectCom_GetError Lib "DirectCOM" Alias "GETINSTANCELASTERROR" ( _
) As String
例如:
1、如你有一个ActiveX的TestDLL,里面有一个类,名为 TestClass,有一方法名为 ShowAbout
2、在access中,将DirectCOM.bas复制到你的模块中
3、输入以下代码到某按钮事件
Dim hTestDll as Long
Dim MyObject as Object
hTestDll = DirectCom_Load("TestDLL.dll") '加载DLL
if hTestDll then '如果加载成功
set MyObject = DirectCom_Create("TestDLL.dll", "TestClass") '直接创建对象,注意该地方只需指明类名即可
if not Myobject is nothing then '如果创建成功
MyObject.ShowAbout '执行类的方法
end if
set Myobject = nothing '释放对象
DirectCom_Free hTestDll '释放DLL
end if
备注:
惊闻access窗体无法在运行中动态创建控件,不禁嘘嘘感叹。
出手未捷鸟先死,Access频寒冬瓜心
附上DirectCom.dll
http://pan.baidu.com/s/1xLA3T
|
|