结束普通方法无法结束的进程澳门新葡亰平台官

1. 问题

把三个服务改为自动:

 使用ntsd程序 (如果安装过VS,在VS的安装目录下,比如“C:Program Files (x86)Debugging Tools for Windows (x86)ntsd.exe”,也可以在这里下载)

当在console中调用API ShellExecuteEx打开"test.iqy"文件时,发现excel会hang住,console退出后excel才会响应,但直接双击"test.iqy"是没有问题的,有意思的是这个情况只有在xp发生,在win7上没有这个问题。

澳门新葡亰平台官网 1

ntsd -c q -p PID
ntsd -c q -pn PName

 

 

两种方法

2. 重现步骤

澳门新葡亰平台官网 2

一种是使用进程的ID号,将PID换成对应进程ID号即可

重现环境:XP sp3 / Office 2007(其他office版本应该也可以,没有测试)

澳门新葡亰平台官网 3

一种是使用进程的名称,将PName换成对应的exe名字即可,比如notepad.exe

 

为了方便,写了个批处理,将该批处理和ntsd放在一起,使用时执行批处理,选择对应的方式,并输入参数即可。

1> 解压iqy_test.zip

@ECHO OFF
TITLE 结束使用普通方法无法结束的进程
COLOR 0A
MODE con: COLS=62 LINES=22

:MENU
set tm1=%time:~0,2%
set tm2=%time:~3,2%
set tm3=%time:~6,2%
ECHO.  %date% %tm1%点%tm2%分%tm3%秒 
ECHO.   ========================================
ECHO.   请选择要进行的操作,然后按回车
ECHO.   ────────────────────
ECHO.  1    根据进程号PID结束进程
ECHO.  2    根据进程名称结束进程

ECHO.  0    退出
ECHO.
ECHO.请输入选择项目的序号:

set /p choose=
if "%choose%" equ "" goto MENU
if %choose%==1 goto killusingpid
if %choose%==2 goto killusingname
if %choose%==0 goto END

ECHO. 输入错误,请输入正确的项目序号:
goto MENU

:killusingpid
set choose=
ECHO.请输入进程号PID,然后按回车
set /p proid=
set /a i=0
:kpid
ntsd -c q -p %proid%
if %i% GEQ 10 ( ( echo 结束进程%proid%失败 ) & goto MENU )
set /a i=%i%+1
echo 结束进程%proid%第%i%次
tasklist | findstr /i %proid% && ( goto kpid )
echo 结束进程ID为%proid%的程序成功或进程ID:%proid%不存在
GOTO MENU

:killusingname
set choose=
ECHO.请输入进程的名称(比如notepad.exe),然后按回车
set /p proname=
set /a i=0
:kpname
ntsd -c q -pn %proname%
if %i% GEQ 10 ( ( echo 结束程序%proname%失败 ) & goto Menu )
set /a i=%i%+1
echo 结束程序%proname%第%i%次
tasklist | findstr /i %proname% && goto kpname
echo 结束程序%proname%成功或程序:%proname%未启动

GOTO MENU

:END
exit

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

 

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

 

shell_execute.exe的主要code:

 

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;
}

 

 

参考:

3. 原因分析

3.1 excel hang在哪里?

 

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

澳门新葡亰平台官网 4

可以看到Excel hang在NtUserMessageCall()中,经过查询知,SendMessage()内部就是调用NtUserMessageCall()来发送消息的。

查看参数知excel调用NtUserMessageCall()类似如下:

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

说明excel给所有顶层窗口发送一个WM_DDE_INITIATE消息,但是有窗口没有response

本文由澳门新葡亰平台官网发布于操作系统,转载请注明出处:结束普通方法无法结束的进程澳门新葡亰平台官

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。