社区
ATL
帖子详情
请大侠帮忙!! 先用shellexecute打开一个文件,在关闭此文件时如何删除它??
happystone1984
2008-09-19 02:31:58
在程序中我先把一个文件放到一个目录下,用shellexecute他(各种格式),在用户手动关闭此文件时,我需要用程序把他删除掉。关键就是不知道此文件何时被关闭。
...全文
183
7
打赏
收藏
请大侠帮忙!! 先用shellexecute打开一个文件,在关闭此文件时如何删除它??
在程序中我先把一个文件放到一个目录下,用shellexecute他(各种格式),在用户手动关闭此文件时,我需要用程序把他删除掉。关键就是不知道此文件何时被关闭。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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来检测进程的返回码,也能判断进程是否退出。
Shell
Execute
(
打开
程序)
总之,
Shell
Execute
函数就是如此简单地
打开
磁盘
文件
和Internet
文件
。
PB中
打开
本地
文件
的四种方法的关键代码.rar
PB中
打开
本地
文件
的四种方法: run方法1:用运行某个EXE
文件
; run方法2:指定用某程序
打开
某
文件
; API方法1:适用于PB10以前版本; API方法2:用于PB10以后版本...
shell
execute
的使用
shell
EXEcute
的使用:调用计算器,调用excel,调用邮箱,调用记事本,
打开
指定网址的网页,
打开
指定的txt
文件
,运行
一个
DOS命令并立即返回等
易语言
打开
TXT
文件
的5种方法
易语言
打开
TXT
文件
的5种方法源码,
打开
TXT
文件
的5种方法,
Shell
Execute
delphi中
shell
Execute
的使用方法
delphi中
shell
Execute
的使用方法......
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章