如何在VB6.0里动态使用具有事件的对象(再来一篇)

其实这是第三次写相同的效果的实现方式了......但这次这个是最简单的.....

前两次见: article.asp?id=207

这次的方法,其实是以前在CSDN经人提醒一下,才恍然大悟的--------直接在VB里定义好不就行了么?还搞那么复杂.

具体如下:

'DLL内cTest内代码

Option Explicit
'动态使用具有事件的对象
'
'BY 嗷嗷叫的老马
'http://www.m5home.com

Public Event KK()

Public Function getEvent()
RaiseEvent KK
End Function


'EXE内代码.需要两个CommandButton.

Option Explicit
'动态使用具有事件的对象
'
'BY 嗷嗷叫的老马
'http://www.m5home.com

Private Declare Sub Sleep Lib "kernel32.dll" ( _
ByVal dwMilliseconds As Long)

Dim WithEvents A As cTest

Private Sub Form_Load()
On Error Resume Next

Set A = CreateObject("pTest.cTest")

If A Is Nothing Then
MsgBox "对象初始化失败!", vbOKOnly or vbInformation
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set A = Nothing
End Sub

Private Sub Command1_Click()
Call A.getEvent
End Sub

Private Sub Command2_Click()
Shell "regsvr32 pTest.dll"
Sleep 1000
Call Form_Load
End Sub

Private Sub A_KK()
MsgBox "事件触发测试!", vbOKOnly or vbInformation
End Sub


点击Commnad2是注册组件(DLL需要放在系统目录或当前目录),然后就可以使用了.

工程打包下载:

点击下载此文件

评论: 7 | 引用: 0 | 查看次数: 1382
jiashie
jiashie[2010-10-19 11:10 AM | ]
直接在exe工程->引用中引用后,如果dll重新编译,则该exe不能运行,可能会出现automation错误或者不能创建acitivex对象。
如果用"动态引用"createObject,如果像博主那样需要使用到事件,恐怕就不行了吧(没试过,不知道声明为withEvents后,再动态引用,同时写上相应的事件处理代码,会不会触发事件)
回复来自 admin 的评论 admin 于 2010-10-19 05:53 PM 回复
Option Explicit
Dim WithEvents objExt As VBControlExtender ' 使用 WithEvents 声明 VBControlExtender 变量

Private Sub LoadControl()
Licenses.Add "Project1.Control1", "ewrinvcmcoe"
Set objExt = Controls.Add("Project1.Control1", "myCtl")
objExt.Visible = True ' 该控件在缺省情况下为不可见的。
End Sub

Private Sub extObj_ObjectEvent(Info As EventInfo)
' 使用 Select Case 语句编写控件的事件处理程序。
Select Case Info.Name
Case "Click"
' 在此处处理 Click 事件。
' 在这里处理其他情况
Case Else ' 未知事件
' 在此处理各种未知的事件。
End Select
End Sub
//
以上是MSDN中的示例,之前一直不知道.....

你可以用用.
admin
admin[2009-09-28 06:10 PM | ]
引用来自 三断笛 引用来自 三断笛
现在的问题是,不能引用pTest.cTest,那要如何触发cTest中的事件呢

为什么不能引用?

接口在目标组件内的实现代码完成前就可以完成的啊.

如果实在是不想引用,那就使用TLB来声明接口-----------------还是需要一个接口的!

具体文章见我提到的前两篇.
三断笛
三断笛[2009-09-28 12:24 AM | ]
现在的问题是,不能引用pTest.cTest,那要如何触发cTest中的事件呢
admin
admin[2009-09-27 01:24 PM | ]
引用来自 三断笛 引用来自 三断笛
不行吧,A是支持事件的对象,而CreateObject("pTest.cTest") 不是支持事件的对象,二者不能绑定啊。而且事件不能继承

A的定义必须是在引用了pTest.cTest之后完成的.

然后在最终客户机器上运行时,CreateObject("pTest.cTest")用于从已注册的组件中创建同样类型的对象并赋值.

如果这两个对象不相同,肯定是不行的.
三断笛
三断笛[2009-09-27 09:39 AM | ]
不行吧,A是支持事件的对象,而CreateObject("pTest.cTest") 不是支持事件的对象,二者不能绑定啊。而且事件不能继承
admin
admin[2009-09-26 11:52 PM | ]
不引用不行.

不过引用了也没啥问题啊.

编译后接口已经被编译了,只要还未使用对象,则即使对象所在的组件并不存在,也不会出错.

所以我代码里利用这一点来判断组件是否正常.
三断笛
三断笛[2009-09-26 08:46 PM | ]
如果不引用pTest呢?就这能这样定义Dim WithEvents A As cTest