Windows消息机制要点,ShellExecuteEX打开iqy文件导致excel

1> 解压iqy_test.zip

7 TranslateMessage, TranslateAccelerator 
TranslateMessage: 把七个virtual-key音讯转化成字符消息(character
message),并内置当前线程的音讯队列中,音信循环下二回抽取管理。
TranslateAccelerator:将火速键对应到对应的美食指南命令。它会把WM_KEYDOWN 或
WM_SYSKEYDOWN转化成急迅键表中相应的WM_COMMAND或WM_SYSCOMMAND新闻,
然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口进程处理,
管理完后才会回到。

查看一下buff的地址:

2 音讯类型 
1) 系统定义新闻(System-Defined Messages)
 
在SDK中优先定义好的新闻,非顾客定义的,其范围在[0x0000, 0x03ff]以内,
能够分为以下三类:
1>窗口音信(Windows Message) 
与窗口的中间运营有关,如创立窗口,绘制窗口,销毁窗口等。能够是形似的窗口,也足以是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL…
2>命令消息(Command Message):注意那类音讯通称为WM_COMMAND
与管理客商必要有关, 如单击菜单项或工具栏或控件时, 就能发生命令消息。
WM_COMMAND, LOWO中华VD(wParam)表示菜单项,工具栏开关或控件的ID。要是是控件,
HIWO瑞虎D(wParam)表示控件消息类型
3> 控件文告(Notify Message) 
控件文告新闻, 那是最灵敏的新闻格式, 其Message, wParam,
lParam分别为:WM_NOTIFY,
控件ID,指向NMHDPRADO的指针。NMHDRubicon包罗控件公告的内容, 能够自由扩充。
2) 程序定义消息(Application-Defined Messages) 
客户自定义的新闻, 对于其范围有如下规定:
WM_USER: 0x0400-0x7FFF    (ex. WM_USER+10)
WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF

1> ShellExecuteEx张开test.iqy的时先创造excel进度

9 BroadcastSystemMessage 
咱俩平时所接触到的音讯都是发送给窗口的,其实,
新闻的收信人能够是出乖弄丑的,它能够是应用程序(applications),
可安装驱动(installable drivers),互联网设施(network drivers),
系统级设备驱动(system-level device drivers)等, 
BroadcastSystemMessage这么些API能够对上述系统组件发送音信。

图片 1

1. 窗口进度 
种种窗口会有三个称呼窗口进度的回调函数(WndProc),它包括几个参数,分别为:窗口句柄(Window
Handle),音信ID(Message ID),和五个新闻参数(wParam,
lParam),当窗口收到音信时系统就能调用此窗口进度来拍卖音讯。(所以叫回调函数)

3> Post WM_DDE_EXECUTE给excel,告知张开test.iqy的一声令下

8(音信死锁( Message Deadlocks) 
假设有线程A和B, 现在有以下下步骤
1) 线程A SendMessage给线程B, A等待新闻在线程B中管理后归来
2) 线程B收到了线程A发来的消息,并拓宽处理, 在管理进程中,B也向线程A
SendMessgae,然后等待从A重临。
因为那时候, 线程A正等待从线程B再次来到, 不能管理B发来的音信,
从而导致了/线程A,B互相等待, 造成死锁。多少个线程也得以变成环形死锁。
能够利用 SendNotifyMessage或SendMessageTimeout来制止出现死锁。

图片 2

5 PostMessage(PostThreadMessage), SendMessage 
PostMessage:把音信放到钦定窗口所在的线程音讯队列中后登时回到。
PostThreadMessage:把音信放到钦点线程的音讯队列中后登时重回。
SendMessage:直接把新闻送到窗口进度管理,管理完了才重临。

6 GetMessage, PeekMessage 
PeekMessage会立时回到能够保留音讯
GetMessage在有音信时回来会去除新闻

3.2.2 为了验证3.2.1的定论,在PostMessageW上下断点跟踪一下

图片 3

4 队列新闻(Queued Messages)和非队列新闻(Non-Queued Messages)
1)队列消息(Queued Messages)
 
新闻会先保存在音讯队列中,新闻循环会从此队列中取音讯并散发到各窗口管理
如鼠标,键盘新闻。
2) 非队列音信(NonQueued Messages) 消息会绕过系统消息队列和线程新闻队列直接发送到窗口进程被拍卖
如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED 
在意: postMessage发送的新闻是队列信息,它会把新闻Post到新闻队列中;
SendMessage发送的消息是非队列消息, 被平素送到窗口过程管理

由此能够可疑是由于console进程在和excel用DDE音信通讯时,console未有响应excel发送的DDE新闻,导致excel
hang住

3 新闻队列(Message Queues) 
Windows中有两系列型的音讯队列
1) 系统音信队列(System Message Queue) 那是三个连串独一的Queue,设备驱动(mouse,
keyboard)会把操作输入转化成新闻存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific
message queue)中等候管理
2) 线程音讯队列(Thread-specific Message Queue) 每三个GUI线程都会维护这么叁个线程音讯队列。(那么些行列唯有在线程调用GDI函数时才会成立,暗中认可不创立)。然后线程音信队列中的新闻会被送到相应的窗口进程(WndProc)管理.
只顾:
线程音信队列中WM_PAINT,WM_TIME中华V只有在Queue中绝非别的音信的时候才会被拍卖,WM_PAINT音讯还或者会被联合以提升效能。别的兼具消息以先进先出(FIFO)的秘技被拍卖。

 

4. 怎么双击张开excel不会hang住

 

图片 4

3> 执行”shell_execute.exe test.iqy”

 

3.1 excel hang在哪里?

瞩目到win7下PostMessageW是用的线程2调用的,搜一下线程创立API
CreateThread

shell_execute.exe的主要code:

以此窗口所属的进度PID =
0xc54,正好是excel的进度,表明ShellExecuteEx确实发送了DDE音讯给excel,何况可执发送的音讯的thread正是主线程

5.1 在API Monitor中看下PostMessageW

能够是ShellExecuteEx内部创设的线程,所以win7上ShellExecuteEx创立了二个线程特意用来管理和excel的DDE音讯通讯,那样就会平时的吸取管理excel发过来的WM_DDE_INITIATE消息了

5>
excel收到WM_DDE_EXECUTE音讯后会广播WM_DDE_INITIATE消息,”WorkerW”窗口所在的console进度由于并未有定义新闻管理函数,ShellExecuteEx定义的”WorkerW”窗口新闻管理函数得不到CPU实践机会,导致不会response该音讯,进而致使excel
hang住

3.3 总结

表明excel给全部顶层窗口发送一个WM_DDE_INITIATE音讯,然则有窗口未有response

碰巧正是展开test.iqy的下令,表达ShellExecuteEx便是先创制了excel的长河,然后发送test.iqy的公文命令给excel展开。

3.1.1 用windbg附加到excel上,输入如下命令查看主线程hang住的地点

3. 缘故剖析

2> 运行http_server.py(需先安装python)

发表评论

电子邮件地址不会被公开。 必填项已用*标注