被excel文件打开的文本,怎样读出内容

图片 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”));
}

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

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 %p\n", shell_exec_info.hProcess);

    return ret;
}

注意到下一个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70
),刚好是取得这一个窗口的pid和tid,查看下参数窗口:

call stack突显的确是ShellExecuteEx所调用

3.1 excel hang在哪里?

翻看一下buff的地点:

 

 

shell_execute.exe的主要code:

图片 2

https://msdn.microsoft.com/en-us/library/windows/desktop/ff468829(v=vs.85).aspx

4. 为啥双击打开excel不会hang住

刚巧就是开拓test.iqy的授命,表明ShellExecuteEx就是先成立了excel的长河,然后发送test.iqy的文本命令给excel打开。

5.1 在API Monitor中看下PostMessageW

4> ShellExecuteEx执行已毕,但并不destroy “WorkerW”窗口

3.3 总结

依照DDE的信息参数,可见wParam就是殡葬音讯的窗口,其句柄为2425190 =
0x250166,反向查询知那是ShellExecuteEx创制的”WorkerW”窗口

图片 3

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

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

经过可以思疑是出于console进度在和excel用DDE音讯通讯时,console没有响应excel发送的DDE音讯,导致excel
hang住

以此窗口所属的历程PID =
0xc54,正好是excel的长河,表明ShellExecuteEx确实发送了DDE音信给excel,而且可执发送的音信的thread就是主线程

可以是ShellExecuteEx内部创设的线程,所以win7上ShellExecuteEx成立了一个线程专门用来拍卖和excel的DDE信息通讯,那样就能健康的收纳处理excel发过来的WM_DDE_INITIATE消息了

接近,大家得以创立一个带窗口的次第,启动后将其挂起,那时,尽管直接双击打开test.iqy也会hang住。

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

3. 缘故分析

图片 4

专注到win7下PostMessageW是用的线程2调用的,搜一下线程创设API
CreateThread

3.2 为了验证3.1.1的算计,用API Monitor一下ShellExecuteEx

 

图片 5

 

5>
excel收到WM_DDE_EXECUTE音讯后会广播WM_DDE_INITIATE新闻,”WorkerW”窗口所在的console进度由于尚未定义信息处理函数,ShellExecuteEx定义的”WorkerW”窗口音讯处理函数得不到CPU执行机会,导致不会response该信息,从而导致excel
hang住

https://files.cnblogs.com/files/organic/iqy_test.zip

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

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

图片 6

图片 7

图片 8

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

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

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

 

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

因为双击打开实际是用explorer.exe打开,而explorer.exe是有窗口的,可以正常的接受处理WM_DDE_INITIATE消息

 

图片 9

5. 为啥win7上不会有这么的标题

2. 复出步骤

图片 10

可以观察Excel
hang在NtUserMessageCall()中,经过查询知,SendMessage()内部就是调用NtUserMessageCall()来发送新闻的。

1. 问题

当在console中调用API
ShellExecuteEx打开”test.iqy”文件时,发现excel会hang住,console退出后excel才会响应,但平素双击”test.iqy”是从未有过难题的,有意思的是其一情景唯有在xp发生,在win7上并未那么些题材。

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

翻开参数知excel调用NtUserMessageCall()类似如下:

表明excel给拥有顶层窗口发送一个WM_DDE_INITIATE音讯,不过有窗口没有response

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

1> 解压iqy_test.zip

 

发表评论

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

网站地图xml地图