彩世界平台-彩世界时时app-彩世界开奖app苹果下载

热门关键词: 彩世界平台,彩世界时时app,彩世界开奖app苹果下载

您的位置:彩世界平台 > 彩世界开奖app苹果下载 > 被excel文件打开的文件,如何读出内容

被excel文件打开的文件,如何读出内容

发布时间:2019-10-11 12:28编辑:彩世界开奖app苹果下载浏览(78)

    1. 问题

    try
    {
    fs = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read), Encoding.GetEncoding("gb2312"));//正常读取文件,如果被excel程序独占的话,此时会抛出异常
    }
    catch(Exception e)
    {
    //抛出异常后,那么就可以拷贝此文件到临时文件夹下生成的一个随机文件中,然后读取此临时文件即可
    string tempFile = Path.GetTempPath() + Path.GetRandomFileName();
    File.Copy(path, tempFile);
    fs = new StreamReader(new FileStream(tempFile, FileMode.Open, FileAccess.Read), Encoding.GetEncoding("gb2312"));
    }

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

     

    2. 重现步骤

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

    1> 解压iqy_test.zip

    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住的地方

    图片 1

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

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

    NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

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

    由此可以怀疑是由于console进程在和excel用DDE消息通信时,console没有响应excel发送的DDE消息,导致excel hang住

     

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

    3.2.1 根据微软的文档可知,发送DDE消息除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都是PostMessage

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

    图片 2

    call stack显示确实是ShellExecuteEx所调用

    图片 3

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

    本文由彩世界平台发布于彩世界开奖app苹果下载,转载请注明出处:被excel文件打开的文件,如何读出内容

    关键词:

上一篇:windows系统,优化C盘空间的方法,windows

下一篇:没有了