• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 请大侠帮忙!!先用shellexecute打开一个文件,在关闭此文件时如何删除它??

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

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 请大侠帮忙!!先用shellexecute打开一个文件,在关闭此文件时如何删除它??等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 请大侠帮忙!! 先用shellexecute打开一个文件,在关闭此文件时如何删除它??
描述:

在程序中我先把一个文件放到一个目录下,用shellexecute他(各种格式),在用户手动关闭此文件时,我需要用程序把他删除掉。关键就是不知道此文件何时被关闭。


解决方案1:

一楼正解 像是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);
}
*/

解决方案2:

这问题比较麻烦,想不出完美的解决方案。
软件“打开”文件通常是CreateFile、读出数据然后就CloseHandle了,后面需要时会再次CreateFile、CloseHandle,所以不能根据文件的状态来判断文件是否被软件“打开”。
很多软件在打开了一个文件之后,再打开其它文件都使用同一个进程,这种情况ShellExecuteEx不能得到进程句柄,CreateProcess创建的进程可能很快就会退出,而文件由另一进程来打开。
比较可靠一点的方法是Hook打开文件和读文件操作,判断读文件的进程结束后再删除文件。
也可以考虑用SetWindowsHookEx的方式,在启动程序后,记录新创建的窗口,当窗口关闭后删除文件。这种方法的可靠性差一些。

解决方案3:

用 ShellExecuteEx 吧,这样打开的进程的句柄会填充到你传递的结构体里面,然后通过 WaitForSingleObject(sei.hProcess, ...) 来等待进程信号,当打开的进程结束时会收到这个信号。或者随时调用GetExitCodeProcess来检测进程的返回码,也能判断进程是否退出。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-06-05 怎么获得设备改变的消息高手请进)
  • 2017-06-05 关于线程的问题
  • 2017-06-04 弱弱的问一下,用ATL做好的控件,一般用什么手段来测试?
  • 2017-06-04 MFC中如何调用ATL的COM库和net库
  • 2017-06-05 const成员函数能否被导出使用
  • 2017-06-04 tapi30开发
  • 2017-06-04 com中创建ocx对象失败
  • 2017-06-05 高分请问:对话框间传递指针出错急盼。
  • 2017-06-04 如何在atl项目中,从CAsyncSocket派生类中访问coclass?
  • 2017-06-05 Toolhelp32ReadProcessMemory是如何使用的,高手请帮忙!!!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请教高手:捕获了控制台关闭消息,但是老是出错
    • 如何使用IEHelper监听到前进,后退的按钮?
    • 用vc如何得到ie中HTML元素的事件句柄。
    • 请教COM相关的多个对象使用的问题?
    • 怎么加入ConvertHexChar这个消息
    • 第一次写activex控件中出现的小问题。
    • 请教初始化com库有多少种方法?
    • WMI到底有多大的能力?
    • 用VC制作OCX时怎么在界面上拖放控件啊
    • 怎么调用activex

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有