-
-
发两篇com in asm资料
-
发表于: 2006-4-6 22:23 6646
-
这个只是用机器翻译过来的,没有修正凑合看吧!
com接收器事件在asm应用
Copyright © 2001 by Ernest Murphy ernie@surfree.com
For educational use only. All commercial use only by written license.
得到原始代码。
摘要
在COM 接口接收器事件被使用作为回call(callback)机制。一请求事件(Event)通知必须被使用, 并且这个协定不再需要时被取消。这种技术行为在二次利用被解释和被巩固。
展示一种简单测试应用。
绪论
事件(Events)也许是"sourced," 或"sinked." 这些 条件是为当前提供近似的电机工程(electrical engineering)条件, 譬如电池(battery)当前的来源, 和消耗, 譬如灯潮流接收器。
引起这次事件的对象是这个来源。接受这次事件的对象是这个接收器。接收器必须从这个来源请求事件通知,并且必须请求什么时候暂停这连接。
事件通知由一个dance请求之间在接收器对象(事件索取者)并且服务器对象(这个供应商)。要会话, 它象这样 :
客户 服务器
你源自事件吗? 是, 我来源于他们。
你来源事件连接IX吗? 是, 我来源那个接口。
为那次事件请选择我。 是, 是cookie。
当然, COM接口为这会话所使用。成功的QueryInterface 答复" 你源自事件吗?"为 IConnectionPointContainer。IConnectionPointContainer:FindConnectionPoint 答复"你来源事件接口IX吗?" 。最终, "为那次事件请选择我。"或经由IConnectionPoint:Advise实际通知请求被使用。程序执行(没有真正误差校验参量)看起来象:
ConnectEvent PROC pIAny:DWORD,pISink:DWORD,pIID_IEvent:DWORD,
pdwCookie:DWORD
;pIAny 连接我们希望连接到的指针。不是NULL。
;pISink 回call接口指针。不是NULL。
;pIID_IEvent 事件参考IID连接。不是NULL。
;pdwCookie 连接cookie参考。必须是NULL。
LOCAL _pICPC:DWORD, pICP:DWORD
coinvoke pIAny,IUnknown,QueryInterface,
pIID_IConnectionPointContainer,
ADDR _pICPC
.IF_SUCCEEDED
;我们的对象支持事件,得到之一!
coinvoke _pICPC, IConnectionPointContainer,
FindConnectionPoint,
pIID_IEvent, ADDR _pICP
.IF_SUCCEEDED
;建议我们这里需要事件
.IF_SUCCEEDED
coinvoke _pICP, IConnectionPoint, Advise, pISink,
pdwCookie
;有我们的事件链接, 发布中间接口
coinvoke _pICP, IUnknown, Release
.ENDIF
.ENDIF
ret
ConnectEvent ENDP
做法发布接收请求相似, 除了它使用IConnectionPoint:Unadvise方法。
Visual Basic事件来源测试节目
VB 来源app是一台简单ActiveX dll服务器。它由数量提供数字特性和一个方法提高它。如果这个数字曾经超出100, 它被重新设置到100 并且事件被射击。为这些感兴趣,如果你是对这个dll. 感兴趣请看原始代码.
这个devil(魔鬼)总是在细节处。这个问题这里是怎么得到句柄在GUIDs这个VB dll用途。VB 不生产一个分开idl文件, 或h文件, 或什么的任何征兆GUIDs。实际上, 我真正地是于相当损失至于怎样VB 记住他们从构造到构造, 除非它创造他们为第一构造, 然后需要他们从最后构造为随后构造。
我发现为这最有用的工具是TlbToInc.exe, 类型库对inc文件由Maurice Montgenie翻译。我有版本1.0,做了一个非常可靠工作翻译, 虽有唯一的例外我必须增加下划线方法名字在他们的声明。我相信这被确定在比较最新的版本。
并且, 我必须为接收器接口手工插入关于LIBID, IID, 和 CLSID事件信息。我能够简单获得这些数字从Sean Baxter's 得到fast型Lib浏览器, 可得到于http://ript.net/~spec/typeinf3/t_browse.exe 。
某些原因, Microsoft's OLEView拒绝打开VB dll, 没有提供给我有用的信息。
关于接口名的一些笔记
当我创造VB 测试app, 我建立类名" MyEventClass " 。VB 创造一个接口为它命名"_ MyEventClass, "注意这个唯一底线。
为输出XMax方法, VB 创造其它接口 "__MyEventClass," 注意这有二个底线。VB没有为这个接口创造CLSID-LIBID, 这些我建立在我自己当它来时刻实施他们。其它app 也许并且实施这同样接口机智它自己的CLSID 和 LIBID 没有冲突。
与Windows混合的COM
同样对scripter app, 我们需要出口接口从我们的exe ( 事件接收器本身) 。事件接收器测试app Sink.exe 是一个简单对话主窗口app, 意味大多数窗口代码这里自Iczelion's 讲解来直接#10.请参见他对这个app.的完美的窗口部份的解释.
这个app的主要步骤如下:
1.初始化: 在WM_CREATE, 我们从VB创造我们的对象,然后建议它我们想要的事件通知。
2.整理: 在WM_DESTROY,我们整理所有, 首先分开我们的事件与未建议(Unadvise)的call, 那么宣布接口从VB 卸载这个dll.
3.射击(Firing)事件: 为这次实证, 所有这些事件是建立信息框告诉我们这次事件发生了。一个严谨的app在同样地方能移动(put)某一严谨的代码。
另外, typelib(类型连接)为接收器接口必须被注册在注册表。为简单,这个app注册如果需要被注册这个lib没有检查。
实施类方法
事件接受器程序没有能比较简单:
MyEvent_XMax PROC
invoke MessageBox, NULL, ADDR sEvent, ADDR DlgName, MB_OK
ret
MyEvent_XMax ENDP
事件接受器是dispinterface,i.e., 它使用IDispatch作为基地址。有些suprisely, VB射击事件与调用方法, 与射击XMax直接相对。这是一个比较慢的call的惯例, 但最安全, 象所有接受器将支持它。如果表现出问题仅仅保留这在意见里。
如果你浏览VB接口,你看见它期望__MyEventClass接口 顶端是一个抽象的IDispatch 接口。然而,CoLib不支持抽象的IDispatch, 因为它总把IDispatch作为一个双重接口。然而, VB 不介意我们怎么实施我们的接口。这将被期望,当COM唯一强加约束在接口, 不是执行。
建立Sink.exe例子
试样应用也许是建立在使用MASM32包(最新版6)与Service Pack 2安装。SP是需要为COM引伸。
新COM不包括文件要求为这个样品。
Sink.asm 意志适当地建立造从快速编辑使用建立所有设置。
结论
事件接收器简单实施和可扩展可再用组成部分的有用性, 那一些是什么COM是所有关于无论如何。
com接收器事件在asm应用
Copyright © 2001 by Ernest Murphy ernie@surfree.com
For educational use only. All commercial use only by written license.
得到原始代码。
摘要
在COM 接口接收器事件被使用作为回call(callback)机制。一请求事件(Event)通知必须被使用, 并且这个协定不再需要时被取消。这种技术行为在二次利用被解释和被巩固。
展示一种简单测试应用。
绪论
事件(Events)也许是"sourced," 或"sinked." 这些 条件是为当前提供近似的电机工程(electrical engineering)条件, 譬如电池(battery)当前的来源, 和消耗, 譬如灯潮流接收器。
引起这次事件的对象是这个来源。接受这次事件的对象是这个接收器。接收器必须从这个来源请求事件通知,并且必须请求什么时候暂停这连接。
事件通知由一个dance请求之间在接收器对象(事件索取者)并且服务器对象(这个供应商)。要会话, 它象这样 :
客户 服务器
你源自事件吗? 是, 我来源于他们。
你来源事件连接IX吗? 是, 我来源那个接口。
为那次事件请选择我。 是, 是cookie。
当然, COM接口为这会话所使用。成功的QueryInterface 答复" 你源自事件吗?"为 IConnectionPointContainer。IConnectionPointContainer:FindConnectionPoint 答复"你来源事件接口IX吗?" 。最终, "为那次事件请选择我。"或经由IConnectionPoint:Advise实际通知请求被使用。程序执行(没有真正误差校验参量)看起来象:
ConnectEvent PROC pIAny:DWORD,pISink:DWORD,pIID_IEvent:DWORD,
pdwCookie:DWORD
;pIAny 连接我们希望连接到的指针。不是NULL。
;pISink 回call接口指针。不是NULL。
;pIID_IEvent 事件参考IID连接。不是NULL。
;pdwCookie 连接cookie参考。必须是NULL。
LOCAL _pICPC:DWORD, pICP:DWORD
coinvoke pIAny,IUnknown,QueryInterface,
pIID_IConnectionPointContainer,
ADDR _pICPC
.IF_SUCCEEDED
;我们的对象支持事件,得到之一!
coinvoke _pICPC, IConnectionPointContainer,
FindConnectionPoint,
pIID_IEvent, ADDR _pICP
.IF_SUCCEEDED
;建议我们这里需要事件
.IF_SUCCEEDED
coinvoke _pICP, IConnectionPoint, Advise, pISink,
pdwCookie
;有我们的事件链接, 发布中间接口
coinvoke _pICP, IUnknown, Release
.ENDIF
.ENDIF
ret
ConnectEvent ENDP
做法发布接收请求相似, 除了它使用IConnectionPoint:Unadvise方法。
Visual Basic事件来源测试节目
VB 来源app是一台简单ActiveX dll服务器。它由数量提供数字特性和一个方法提高它。如果这个数字曾经超出100, 它被重新设置到100 并且事件被射击。为这些感兴趣,如果你是对这个dll. 感兴趣请看原始代码.
这个devil(魔鬼)总是在细节处。这个问题这里是怎么得到句柄在GUIDs这个VB dll用途。VB 不生产一个分开idl文件, 或h文件, 或什么的任何征兆GUIDs。实际上, 我真正地是于相当损失至于怎样VB 记住他们从构造到构造, 除非它创造他们为第一构造, 然后需要他们从最后构造为随后构造。
我发现为这最有用的工具是TlbToInc.exe, 类型库对inc文件由Maurice Montgenie翻译。我有版本1.0,做了一个非常可靠工作翻译, 虽有唯一的例外我必须增加下划线方法名字在他们的声明。我相信这被确定在比较最新的版本。
并且, 我必须为接收器接口手工插入关于LIBID, IID, 和 CLSID事件信息。我能够简单获得这些数字从Sean Baxter's 得到fast型Lib浏览器, 可得到于http://ript.net/~spec/typeinf3/t_browse.exe 。
某些原因, Microsoft's OLEView拒绝打开VB dll, 没有提供给我有用的信息。
关于接口名的一些笔记
当我创造VB 测试app, 我建立类名" MyEventClass " 。VB 创造一个接口为它命名"_ MyEventClass, "注意这个唯一底线。
为输出XMax方法, VB 创造其它接口 "__MyEventClass," 注意这有二个底线。VB没有为这个接口创造CLSID-LIBID, 这些我建立在我自己当它来时刻实施他们。其它app 也许并且实施这同样接口机智它自己的CLSID 和 LIBID 没有冲突。
与Windows混合的COM
同样对scripter app, 我们需要出口接口从我们的exe ( 事件接收器本身) 。事件接收器测试app Sink.exe 是一个简单对话主窗口app, 意味大多数窗口代码这里自Iczelion's 讲解来直接#10.请参见他对这个app.的完美的窗口部份的解释.
这个app的主要步骤如下:
1.初始化: 在WM_CREATE, 我们从VB创造我们的对象,然后建议它我们想要的事件通知。
2.整理: 在WM_DESTROY,我们整理所有, 首先分开我们的事件与未建议(Unadvise)的call, 那么宣布接口从VB 卸载这个dll.
3.射击(Firing)事件: 为这次实证, 所有这些事件是建立信息框告诉我们这次事件发生了。一个严谨的app在同样地方能移动(put)某一严谨的代码。
另外, typelib(类型连接)为接收器接口必须被注册在注册表。为简单,这个app注册如果需要被注册这个lib没有检查。
实施类方法
事件接受器程序没有能比较简单:
MyEvent_XMax PROC
invoke MessageBox, NULL, ADDR sEvent, ADDR DlgName, MB_OK
ret
MyEvent_XMax ENDP
事件接受器是dispinterface,i.e., 它使用IDispatch作为基地址。有些suprisely, VB射击事件与调用方法, 与射击XMax直接相对。这是一个比较慢的call的惯例, 但最安全, 象所有接受器将支持它。如果表现出问题仅仅保留这在意见里。
如果你浏览VB接口,你看见它期望__MyEventClass接口 顶端是一个抽象的IDispatch 接口。然而,CoLib不支持抽象的IDispatch, 因为它总把IDispatch作为一个双重接口。然而, VB 不介意我们怎么实施我们的接口。这将被期望,当COM唯一强加约束在接口, 不是执行。
建立Sink.exe例子
试样应用也许是建立在使用MASM32包(最新版6)与Service Pack 2安装。SP是需要为COM引伸。
新COM不包括文件要求为这个样品。
Sink.asm 意志适当地建立造从快速编辑使用建立所有设置。
结论
事件接收器简单实施和可扩展可再用组成部分的有用性, 那一些是什么COM是所有关于无论如何。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2023-8-20 00:10
伟叔叔
为你点赞~
2023-5-17 00:05
一笑人间万事
为你点赞~
2023-4-30 00:04
心游尘世外
为你点赞~
2023-4-14 02:04
飘零丶
为你点赞~
2023-4-13 01:40
shinratensei
为你点赞~
2023-3-20 05:26
QinBeast
为你点赞~
2023-3-20 05:25
赞赏
他的文章
- [原创]MyVM_#1_KeygenMe_by_BUBlic虚拟机粗略分析记录 7787
- 失业的娱乐-IDA逆向工程入门(一)(二)(三)(四) 59607
- plugin sdk masm sample注释翻译 10860
- 大家试试这样做,看看OD有问题吗? 4458
- “调戏”OD 4801
看原图
赞赏
雪币:
留言: