请大侠帮忙!! 先用shellexecute打开一个文件,在关闭此文件时如何删除它??

happystone1984 2008-09-19 02:31:58
在程序中我先把一个文件放到一个目录下,用shellexecute他(各种格式),在用户手动关闭此文件时,我需要用程序把他删除掉。关键就是不知道此文件何时被关闭。
...全文
183 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
smallfishff 2008-09-19
  • 打赏
  • 举报
回复
一楼正解 像是MSDN的例程


/*等待调用程序结束


SHELLEXECUTEINFO exeInfo;
exeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
exeInfo.fMask = (SEE_MASK_DOENVSUBST|SEE_MASK_FLAG_DDEWAIT|0x04000000|SEE_MASK_NOCLOSEPROCESS|SEE_MASK_NO_CONSOLE);
exeInfo.hwnd = NULL;
exeInfo.lpVerb = "open";
exeInfo.lpFile = (LPCTSTR)"文件路径";
exeInfo.lpParameters = NULL;
exeInfo.lpDirectory = NULL;
exeInfo.nShow = SW_SHOWNORMAL;
exeInfo.hInstApp = NULL;
exeInfo.lpIDList = NULL;
exeInfo.lpClass = NULL;
exeInfo.hkeyClass = NULL;
exeInfo.dwHotKey = NULL;
exeInfo.hMonitor = NULL;
exeInfo.hIcon = NULL;
exeInfo.hProcess = NULL;

::ShellExecuteEx(&exeInfo);//执行后 主程会被挂起 等待被调用程序结束 才继续执行
if(exeInfo.hProcess)
{
::WaitForSingleObject(exeInfo.hProcess,INFINITE);
::CloseHandle(exeInfo.hProcess);
}
*/
cnzdgs 2008-09-19
  • 打赏
  • 举报
回复
这问题比较麻烦,想不出完美的解决方案。
软件“打开”文件通常是CreateFile、读出数据然后就CloseHandle了,后面需要时会再次CreateFile、CloseHandle,所以不能根据文件的状态来判断文件是否被软件“打开”。
很多软件在打开了一个文件之后,再打开其它文件都使用同一个进程,这种情况ShellExecuteEx不能得到进程句柄,CreateProcess创建的进程可能很快就会退出,而文件由另一进程来打开。
比较可靠一点的方法是Hook打开文件和读文件操作,判断读文件的进程结束后再删除文件。
也可以考虑用SetWindowsHookEx的方式,在启动程序后,记录新创建的窗口,当窗口关闭后删除文件。这种方法的可靠性差一些。
zhoujianhei 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jameshooo 的回复:]
用 ShellExecuteEx 吧,这样打开的进程的句柄会填充到你传递的结构体里面,然后通过 WaitForSingleObject(sei.hProcess, ...) 来等待进程信号,当打开的进程结束时会收到这个信号。或者随时调用GetExitCodeProcess来检测进程的返回码,也能判断进程是否退出。
[/Quote]

汗,学习啦。
jia_xiaoxin 2008-09-19
  • 打赏
  • 举报
回复
shellexecute没法解决,你可以用ShellExecuteEx
它的参数是个结构SHELLEXECUTEINFO
最后一项为HANDLE hProcess;也就是被打开的进程
zhoujianhei 2008-09-19
  • 打赏
  • 举报
回复
使用CreateProcess并返回其进程句柄,等待就可以啦。
至于各种格式,可以查询注册表获取其默认的打开方式及应用程序路径。

vrace 2008-09-19
  • 打赏
  • 举报
回复
那个最简单的办法..就是一直不停地删,直到删除成功...
jameshooo 2008-09-19
  • 打赏
  • 举报
回复
用 ShellExecuteEx 吧,这样打开的进程的句柄会填充到你传递的结构体里面,然后通过 WaitForSingleObject(sei.hProcess, ...) 来等待进程信号,当打开的进程结束时会收到这个信号。或者随时调用GetExitCodeProcess来检测进程的返回码,也能判断进程是否退出。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧