console退出后excel才会响应

查阅参数知excel调用NtUserMessageCall(卡塔尔(قطر‎相通如下:

1> ShellExecuteEx展开test.iqy的时先创设excel进程

4118云顶集团手机版 1

3.1 excel hang在哪里?

2. 复出步骤

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

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

4118云顶集团手机版 2

1. 问题

4> ShellExecuteEx实践落成,但并不destroy "WorkerW"窗口

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

重现情形:XP sp3 / Office 二〇〇六(别的office版本应该也得以,未有测量试验)

因为双击展开实际是用explorer.exe张开,而explorer.exe是有窗口的,能够健康的吸收接纳管理WM_DDE_INITIATE消息

刚刚正是开拓test.iqy的通令,表明ShellExecuteEx正是先创制了excel的经过,然后发送test.iqy的文书命令给excel张开。

4118云顶集团手机版 3

 

4118云顶集团手机版 4

在API Monitor中追寻一下PostMessage的调用,果然搜到一条

4118云顶集团手机版 5

5> excel收到WM_DDE_EXECUTE新闻后会广播WM_DDE_INITIATE消息,"WorkerW"窗口所在的console进度由于还未有定义音信管理函数,ShellExecuteEx定义的"WorkerW"窗口语资源新闻息管理函数得不到CPU实施机遇,引致不会response该音信,进而引致excel hang住

3.2 为了验证3.1.1的猜忌,用API Monitor一下ShellExecuteEx

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

 

看似,大家可以创设叁个带窗口的次序,运转后将其挂起,此时,尽管直接双击展开test.iqy也会hang住。

bool shell_execute_file(wstring file_path)
{
    SHELLEXECUTEINFOW shell_exec_info = { 0 };
    shell_exec_info.cbSize = sizeof(SHELLEXECUTEINFOW);
    shell_exec_info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
    shell_exec_info.hwnd = NULL;
    shell_exec_info.lpVerb = NULL;
    shell_exec_info.lpFile = file_path.c_str();
    shell_exec_info.lpParameters = NULL;
    shell_exec_info.lpDirectory = NULL;
    shell_exec_info.nShow = SW_SHOW;
    shell_exec_info.hInstApp = NULL;
    bool ret = ShellExecuteExW(&shell_exec_info);
    printf("process handle is %pn", shell_exec_info.hProcess);

    return ret;
}

本条窗口所属的长河PID = 0xc54,适逢其时是excel的长河,表明ShellExecuteEx确实发送了DDE新闻给excel,何况可执发送的音讯的thread就是主线程

4118云顶集团手机版 6

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

 

call stack突显实在是ShellExecuteEx所调用

当在console中调用API ShellExecuteEx展开"test.iqy"文件时,开掘excel会hang住,console退出后excel才会响应,但一贯双击"test.iqy"是一向不难点的,有意思的是以此境况唯有在xp产生,在win7上向来不这么些主题素材。

 

3> Post WM_DDE_EXECUTE给excel,告知张开test.iqy的吩咐

shell_execute.exe的主要code:

4118云顶集团手机版,透过能够嫌疑是由于console进程在和excel用DDE音信通讯时,console未有响应excel发送的DDE消息,招致excel hang住

3.3 总结

依照DDE的音讯参数,可以看到wParam就是出殡和安葬音讯的窗口,其句柄为2425190 = 0x250166,反向查询知那是ShellExecuteEx成立的”WorkerW”窗口

4118云顶集团手机版 7

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

消息1000为WM_DDE_EXECUTE,Post窗口句柄为0x00310172。

3.2.1 根据微软的文书档案可以预知,发送DDE新闻除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都以PostMessage

2> 然后创立三个"WorkerW"的窗口用于DDE通讯

 

翻开一下buff的地点:

4118云顶集团手机版 8

瞩目到下二个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70 卡塔尔,正巧是得到这一个窗口的pid和tid,查看下参数窗口:

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

留意到win7下PostMessageW是用的线程2调用的,搜一下线程创制API CreateThread

 

说明excel给持有顶层窗口发送八个WM_DDE_INITIATE新闻,但是有窗口未有response

4118云顶集团手机版 9

5.1 在API Monitor中看下PostMessageW

1> 解压iqy_test.zip

能够看看Excel hang在NtUserMessageCall(卡塔尔国中,经过查询知,SendMessage(State of Qatar内部正是调用NtUserMessageCall(卡塔尔(قطر‎来发送音信的。

5. 为何win7上不会好似此的标题

 

4118云顶集团手机版 10

3. 原因剖判

返回列表