Office中国论坛/Access中国论坛

标题: Access菜鸟七大邪门武器之二——免注册使用ActiveX控件 [打印本页]

作者: ganlinlao    时间: 2013-11-3 09:37
标题: Access菜鸟七大邪门武器之二——免注册使用ActiveX控件
本帖最后由 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

作者: t小宝    时间: 2013-11-3 10:36
顶起,这个比使用纯代码更加稳定
作者: t小宝    时间: 2013-11-3 10:44
可是之一呢?
作者: tmtony    时间: 2013-11-3 17:37
赞一个!
作者: 轻风    时间: 2013-11-4 09:20
t小宝 发表于 2013-11-3 10:44
可是之一呢?

我也纳闷了,楼主只发一个主题贴,怎么就之二了呢?
作者: admin    时间: 2013-11-4 10:15
之一被楼主吃了!{:soso_e120:} 这是好东西,必须顶起
作者: coolleaf    时间: 2013-11-15 23:30
这东西有点深,用不了。
作者: 岭南王子    时间: 2015-5-14 00:12
不错!好文章!
作者: zpy2    时间: 2015-5-14 06:25
好文章.赞一个
作者: huzijunreokiki    时间: 2015-5-28 17:26
好贴!
作者: gujin162    时间: 2015-11-30 10:15

我就是来看看~么么哒~~
作者: hunrybecky    时间: 2015-12-19 22:15
经过测试,与部分控件不兼容,只有一家在,ACCESS卡死 ,比如FoxitReader.ocx
作者: ganlinlao    时间: 2015-12-24 21:13
DirectCom并不支持ocx控件。
如果要使用免注册的ocx控件,有三种途径:
(1)、driectOcx
(2)、vb6的SideByside方式
(3)、用Atl7.1.dll直接使用事件连接点  (在freebasic中就是使用这种方式)
vb6已死,有事烧纸,在这里我不想再多说什么。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3