当前位置:编程学习 > VB >>

DLL 通知调用者

VB 做的DLL怎么通知调用者?比如说,DLL接收到数据了,马上通知调用者并且将数据传过去

换一种说法,就是要调用者实现一个方法,而有数据来了,这个方法被DLL通知 --------------------编程问答-------------------- 这应能做到,dll在VB里就是类,当类的接口传入数据时,是可以通过类的方法传出信息来的 --------------------编程问答-------------------- 我不是问能否做到,是问怎么做
谢谢楼上 --------------------编程问答-------------------- 同老张.

DLL里的公共类里声明一个事件:

public event MyEvent(byref MyParam)

再在调用此对象时用withevents声明:

private withevents MyDLLObj as MyObj

代码里就能像使用定时器事件一样使用你这个对象的事件了.

DLL里使用raiseevent触发事件:

raiseevent myevent(myparam) --------------------编程问答-------------------- 老马的手段要高明些!
最容易想到的是:
DLL中返回信息是可以的。当类的接口接收到外部数据时,通过比较默认值,就可知道是否有外部数据传入,这时只需要设置一个返回参数即可以了。 --------------------编程问答-------------------- 另外一种办法,就是使用回调函数.

不过在VB里不好做....

我以前用汇编写了个DLL时就用到了这招,把一个模块里的函数地址传给DLL,再在DLL里CALL --------------------编程问答-------------------- 其实MSDN提供了VB的两种方法,并对其进行了一些探讨
1 事件Event
2 接口Interface

--------------------编程问答-------------------- 异步的回调与事件


在客户端发出一个方法调用后,客户端将被阻塞,直至调用返回为止,这种方式被称为同步处理。也就是说,在客户端等待期间它不能执行任何代码。若使用异步处理,就可以在等待期间让客户端做其它的事情。

在异步处理中,方法调用在启动一个任务后就立即返回,也不带返回值。在部件处理该任务期间,客户端接着处理自己的业务。任务完成后,部件会通知客户端已经处理完毕。

如果客户端对某些事情感兴趣,例如,数据库的值改变、消息的到达等,则可以使用异步处理来通知客户端。客户端告诉部件需要了解哪些情况,在发生这些事情时,部件就会通知客户端。

这两种情况都依赖于异步通知。当客户端应用程序处理自己的业务时,它们可能突然收到事件的通知:异步请求已经完成,或者报告某个感兴趣的事件的发生。

Visual Basic 提供两种机制来实现异步通知:事件和回调方法。这将在以下主题中论述。 

使用事件的异步通知 最简单的通知技术就是让部件产生一个事件。客户端处理这个事件,并采取相应的动作。


使用回调方法的异步通知 客户端实现一个回调方法接口,在需要通知时由部件调用该回调。


何时使用事件或回调通知 解释决定选用事件或回调如何影响通知的特征,并提供准则来决定使用哪一个。 
详细信息 “创建 ActiveX EXE 部件”中的循序渐进过程介绍了如何使用事件和回调方法实现异步通知。
--------------------编程问答-------------------- 使用事件的异步通知


使用事件实现异步处理可分为两部分工作。第一部分是部件的设计人员的责任。设计人员需要: 

定义要执行的任务或通知。


提供一个或多个可在外部创建的类来管理任务或通知。管理器类可以完成具体的处理工作,也可以用另一个工作类来做实际的处理。


管理器类应提供由客户端调用的方法,用于初始化任务或者注册要求通知。


声明客户端为了接收通知而必须处理的事件。


编写代码,启动任务进程或监视感兴趣事件的进程。


在完成任务或者观察到感兴趣事件时发出事件。 
第二部分是使用这个部件的开发者的工作。开发者应该: 

创建一个 WithEvents 变量来引用提供通知事件的对象。


在与 WithEvents 变量关联的事件过程中,编写代码处理所需的通知事件。


编写代码,请求部件的管理器类实例,并将其引用存放在 WithEvents 变量中。


编写代码,调用相应的方法来初始化任务或要求通知。 
图 8.12 显示了设计人员部分和开发者部分是如何相互作用,为 CoffeeReady 示例提供异步处理。这个 CoffeeReady 示例来自“创建 ActiveX EXE 部件”的循序渐进过程。

图 8.12 使用事件的异步通知



注意 图 8.12 中的号码代表在已结束的应用程序和部件中发生的事情的顺序。它们和任务列表中的号码并不是对应的。

单个事件可以被多个客户端处理。将多个客户端连到单个 Coffee 对象的一种方法是在客户端与 Coffee 对象之间插入一个 Connection 对象。在这种方法中,每个客户端都有自己的 Connection 对象,每个 Connection 对象为各自的客户端提供对同一个 Coffee 对象的引用。

如果客户端的 WithEvents 变量存放了 Coffee 对象引用,它就可以接收 Coffee 对象的 CoffeeReady 事件。

注意 Visual Basic 的事件可被认为是匿名的。也就是说,产生该事件的对象无法知道指定的事件是由一个、两个还是两打对象来处理,也可能根本就没有对象处理。此外,产生事件的对象也不知道在处理该事件的代码中是否发生了错误。

重点 如果系统中有多个客户端接收同一个事件,决不能预先假定客户端接收事件的顺序。这个顺序是无法定义的,而且可能与版本号或平台有关。

详细信息 关于这些任务的执行方法,请参阅“创建 ActiveX EXE 部件”中的循序渐进过程,其中演示了使用事件和回调的异步通知。
--------------------编程问答-------------------- --------------------编程问答-------------------- COM不是有连接点的技术么? --------------------编程问答-------------------- 获得可用分 --------------------编程问答--------------------
引用 6 楼 sonic_andy 的回复:
其实MSDN提供了VB的两种方法,并对其进行了一些探讨
1 事件Event
2 接口Interface

就是这两种方法,根据需要选用:
事件可以有多个接收者,并且其中一个接收者修改了 byref 参数后会对后续的接收者产生影响。
而接口通常只用一个接收者,避免被多重接收。 --------------------编程问答-------------------- 如果是C,感觉还好一些,VB在这方面没试过 --------------------编程问答-------------------- 回调函数 --------------------编程问答--------------------
如果用老马的事件通知方法: 
1. 好处:“反正都引用了dll中的类,不如多提供个事件接口给我,不用白不用,简单明了!”
2. 问题:如果不是显式引用,比如用createobject创建的对象,无法定义withevents声明,如何使用event通知?



如果用老张的方法:
这样也很好,好像也解决了非显式引用的问题,但是调用者必须传递一个类引用,让dll调用这个类的方法,
这样的话会不会有循环引用或者引用不释放的问题(或者说有这个危险)?



如果用回调的方法:
如果是缓冲区的数据,觉得用“sendmessage + wm_copydata”比较好,就是我怕dll是多线程的!!
这样dll用什么语言写都无所谓了。
--------------------编程问答--------------------
如果用老马的事件通知:
好处:反正都引用dll的类,不如多提供个事件接口,简单明了。
问题:如果是非显式引用比如creageobject创建的话,如何使用withevents定义?


如果用老张的类方法:
好像解决了非显式的问题,但传递一个类引用给dll让dll调用其方法,会不会有循环引用或不释放的危险?


如果用回调方法:
传递一个函数地址好像vb写的dll无法处理。如果是纯粹的缓冲区数据,我觉得用“sendmessage + wm_copydata”比较好,无论dll是多线程,还是其他语言写的,兼容好些并且也没有多耗费多少代码。
--------------------编程问答-------------------- 如果用老马的事件通知:
好处:反正都引用dll的类,不如多提供个事件接口,简单明了。
问题:如果是非显式引用比如creageobject创建的话,如何使用withevents定义?


如果用老张的类方法:
好像解决了非显式的问题,但传递一个类引用给dll让dll调用其方法,会不会有循环引用或不释放的危险?


如果用回调方法:
传递一个函数地址好像vb写的dll无法处理。如果是纯粹的缓冲区数据,我觉得用“sendmessage + wm_copydata”比较好,无论dll是多线程,还是其他语言写的,兼容好些并且也没有多耗费多少代码。 --------------------编程问答-------------------- 调用api函数dll的时候把被响应函数地址传进去

com类型的dll这样方便private withevents MyDLLObj as MyObj
用vb的dll一般都是com

--------------------编程问答-------------------- mark --------------------编程问答-------------------- 楼上的好功夫,遗传绝学? --------------------编程问答-------------------- com的用事件,
动态链接库用回调 --------------------编程问答-------------------- 靠,什么年代的帖子 --------------------编程问答--------------------
引用 22 楼 zzhgb 的回复:

靠,什么年代的帖子
--------------------编程问答-------------------- ActiveX 很容易,采用事件回调就可以了。
  --------------------编程问答--------------------
引用 24 楼 gooore 的回复:
ActiveX 很容易,采用事件回调就可以了。

哥呀,人家是挖出来的帖子,你还回复! --------------------编程问答-------------------- 呵呵..没注意...

引用 25 楼 aisac 的回复:
引用 24 楼 gooore 的回复:
ActiveX 很容易,采用事件回调就可以了。

哥呀,人家是挖出来的帖子,你还回复!
--------------------编程问答-------------------- 流行挥舞锄头,偶也来挖挖
补充:VB ,  COM/DCOM/COM+
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,