急:删除不掉库文件的问题!

bazzi2011 2018-06-14 10:58:52
目前在写一个卸载程序。遇到一个很诡异的问题。
卸载程序的目的是把安装文件夹及文件夹下的所有文件删除。
比如安装目录为“c://setup”,目标就是要把setup文件夹跟里面的文件全部删掉。

由于删除exe程序也在安装目录下,所以使用的方法是:安装目录下放两个exe程序,其中一个命名为Uninstall.exe,另外一个命名为real.exe。实现的方法是当点击Uninstall.exe时,把real.exe拷贝到临时文件夹下【C:\Users\用户名\AppData\Local\Temp】,然后调用临时文件夹下的real.exe,把安装目录“c://setup”及其文件全部删掉。

怪就怪在这里,安装文件夹中有一个程序所需的系统库,名为“api-ms-win-core-synch-l1-2-0.dll”,在我运行临时文件夹下的real.exe删除文件时,这个库显示被real.exe占用,无法删除。我无法理解,因为我运行的是临时文件夹下的real.exe,跟安装目录已经没有什么瓜葛了,为何real.exe还会占用这个库?????【ps:安装文件夹下的其它库都能删除,安装目录下的real.exe和Uninstall.exe也能删除】

PS:我怀疑是我的配置项配的不够正确:
我的程序的win32程序,duilib做界面。卸载程序也做了静态编译。比如在MFC的使用中选择了“在静态库中使用mfc”,多线程中选择了“MT”,并在附加依赖项中包含了”Kernel32.lib;User32.lib;Gdi32.lib;OleAut32.lib;Ole32.lib;Shell32.lib;Shlwapi.lib;Normaliz.lib;Advapi32.lib;ws2_32.lib;imm32.lib;”等所需的静态库库。

请求各位不吝赐教!!!
...全文
979 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bazzi2011 2018-06-20
  • 打赏
  • 举报
回复
引用 9 楼 adlay 的回复:
[quote=引用 6 楼 bazzi2011 的回复:] [quote=引用 4 楼 adlay 的回复:] 你的工作目录切换到了临时目录没有? 还是指向的 setup 吗?
你指的的切换临时目录是写在被拷贝到临时文件夹下的那个exe里吗? 我刚刚我试了下这样 TCHAR szFilePath[MAX_PATH + 1] = { 0 }; GetModuleFileName(NULL, szFilePath, MAX_PATH); (_tcsrchr(szFilePath, _T('\\')))[1] = 0; //删除文件名 std::string strOrgPath = szFilePath; SetCurrentDirectory(strOrgPath.c_str()); 也没有起到作用。 是不是我设置错了???[/quote] 不是, uninstall 启动 real.exe 的时候, CreateProcess 传递的当前目录. exe 加载的时候搜索 dll 的顺序当前目录在系统目录之前. 你等 exe 启动后再修改只能影响之后 Loadlibary 加载的 dll, 之前已经加载的影响不到.[/quote] 的确是工作目录设置的问题,吧工作目录设置到临时文件夹后就不占用库了。
www_adintr_com 2018-06-14
  • 打赏
  • 举报
回复
你的工作目录切换到了临时目录没有? 还是指向的 setup 吗?
paschen 版主 2018-06-14
  • 打赏
  • 举报
回复
建议查看你EXE加载的模块及所在路径,并非是EXE所在路径,如果调用了OCX,取决于注册的OCX路径
sghcpt 2018-06-14
  • 打赏
  • 举报
回复
楼主,如果还没有找到解决问题的办法。可以试试这个:一般软件发布和卸载都有相应的软件可以实现,例如Innosetup这类的软件安装包制作,你只要把你软件的exe文件及依赖的文件添加到Innosetup安装包软件中,就可以制作出一个安装包exe文件,安装后会生成相应的卸载执行文件的。
bazzi2011 2018-06-14
  • 打赏
  • 举报
回复
这是我的配置,是不是还有啥配置不对的地方???



www_adintr_com 2018-06-14
  • 打赏
  • 举报
回复
引用 6 楼 bazzi2011 的回复:
[quote=引用 4 楼 adlay 的回复:] 你的工作目录切换到了临时目录没有? 还是指向的 setup 吗?
你指的的切换临时目录是写在被拷贝到临时文件夹下的那个exe里吗? 我刚刚我试了下这样 TCHAR szFilePath[MAX_PATH + 1] = { 0 }; GetModuleFileName(NULL, szFilePath, MAX_PATH); (_tcsrchr(szFilePath, _T('\\')))[1] = 0; //删除文件名 std::string strOrgPath = szFilePath; SetCurrentDirectory(strOrgPath.c_str()); 也没有起到作用。 是不是我设置错了???[/quote] 不是, uninstall 启动 real.exe 的时候, CreateProcess 传递的当前目录. exe 加载的时候搜索 dll 的顺序当前目录在系统目录之前. 你等 exe 启动后再修改只能影响之后 Loadlibary 加载的 dll, 之前已经加载的影响不到.
赵4老师 2018-06-14
  • 打赏
  • 举报
回复
http://www.nirsoft.net/utils/opened_files_view.html 用这个工具看一下是哪个进程打开了你这个库。
bazzi2011 2018-06-14
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
为什么用exe而不用bat呢?!
我试过用bat,也是一样,弄个bat文件把删除exe拷到临时文件夹,然后再调用,那个库依旧被占用
bazzi2011 2018-06-14
  • 打赏
  • 举报
回复
引用 4 楼 adlay 的回复:
你的工作目录切换到了临时目录没有? 还是指向的 setup 吗?
你指的的切换临时目录是写在被拷贝到临时文件夹下的那个exe里吗? 我刚刚我试了下这样 TCHAR szFilePath[MAX_PATH + 1] = { 0 }; GetModuleFileName(NULL, szFilePath, MAX_PATH); (_tcsrchr(szFilePath, _T('\\')))[1] = 0; //删除文件名 std::string strOrgPath = szFilePath; SetCurrentDirectory(strOrgPath.c_str()); 也没有起到作用。 是不是我设置错了???
赵4老师 2018-06-14
  • 打赏
  • 举报
回复
为什么用exe而不用bat呢?!

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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