如何实现两个exe的通信?

pengys 2008-05-06 06:09:28
在A.exe中调用B.exe打开文件a.txt进行浏览,A.exe中实现删除a.txt文件的功能,要删除a.txt需要知道该文件没有被B.exe打开,也就是说当B.exe关闭的时候,才能执行A.exe中删除文件功能.如何实现请高手指教.
...全文
290 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengys 2008-05-09
  • 打赏
  • 举报
回复
感谢大家,尤其是icansaymyabc学习与进步,通过他的提醒,改写b.exe的代码,增加一个是否要删除文件的参数实现的.
icansaymyabc 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pengys 的回复:]

b.exe的源码虽然可以修改,但是按你的逻辑是应用程序打开文件,浏览后关闭文件就删除原文件,这个合乎逻辑吗?
你用记事本打开一个文件,这个文件就被记事本删除了,你能接受吗?
[/Quote]

你咋这么想不明白呢?记事本不是我开发的也不是我的任何应用的组件之一,我当然不能让他把我的文件删除。

可是你的 a 和 b 本来就是一个整体,共同完成你规定的任务。

目前你有一个需求,就是看过文件就删,这个任务交给 b 来做是无比轻松,而交给 a 来做却是困难重重。你偏偏就是要指定 a 来做,决不让 b 来做,不知道你这是合乎什么逻辑!

谈到逻辑,b 作为这个应用的组件之一,完成这个应用所需的功能,这不合逻辑吗? 如果你需要有的文件删掉、有的文件保留,一切要 a 来决定,你可以再改写 b 的代码,增加一个是否要删除文件的参数,这不合逻辑吗?

归根结底还是你的运筹学没学好
harry_qj 2008-05-08
  • 打赏
  • 举报
回复
发送消息也可以吧
fly_wawe 2008-05-08
  • 打赏
  • 举报
回复
可以另外设置一个标识量,当B.EXE关闭后,写入TRUE
A.EXE删除时,先检测该标识量,为TRUE就删,不为TRUE,则。。。
cnzdgs 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pengys 的回复:]
引用 11 楼 cnzdgs 的回复:
既然这样,你在B.exe打开文件时不要设置共享删除标志就可以了,这样在文件没有关闭之前是删除不掉的,A.exe可以循环删除这个文件,如果删除成功则结束循环,否则Sleep一下再执行删除,如果不想阻塞线程可以用SetTimer来定时执行删除,删除成功后取消定时。此外也可以利用命名事件由B来通知A。

不能阻塞线程,用定时器也感觉不太好.
[/Quote]
那就用消息或者命名对象来通知。
pengys 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 icansaymyabc 的回复:]
引用 9 楼 pengys 的回复:
1.B.exe的源代码可以修改
2.必须等到B.exe所打开的文件关闭后,删除文件


你干吗不改写 b.exe, 让他关闭文件后立即删除之, 非得让 a.exe 来干删除文件这事?

你这是运筹学没学好,不会合理统筹安排任务。
[/Quote]
我运筹学刚刚及格呵呵!
b.exe的源码虽然可以修改,但是按你的逻辑是应用程序打开文件,浏览后关闭文件就删除原文件,这个合乎逻辑吗?
你用记事本打开一个文件,这个文件就被记事本删除了,你能接受吗?
pengys 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cnzdgs 的回复:]
既然这样,你在B.exe打开文件时不要设置共享删除标志就可以了,这样在文件没有关闭之前是删除不掉的,A.exe可以循环删除这个文件,如果删除成功则结束循环,否则Sleep一下再执行删除,如果不想阻塞线程可以用SetTimer来定时执行删除,删除成功后取消定时。此外也可以利用命名事件由B来通知A。
[/Quote]
不能阻塞线程,用定时器也感觉不太好.
pengys 2008-05-07
  • 打赏
  • 举报
回复
1.B.exe的源代码可以修改
2.必须等到B.exe所打开的文件关闭后,删除文件
acinonyx 2008-05-07
  • 打赏
  • 举报
回复
共享内存、消息队列也可以。
cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
请LZ先回答两个问题:
1、B.exe的源代码能不能修改?
2、你的需求只是删除文件还是必须要等到B.exe退出后才删除文件?
pengys 2008-05-07
  • 打赏
  • 举报
回复
B.exe是个COM,通过ocx浏览文件的,A.exe不是通过CreateProcess或者ShellExecuteEx来加载B.exe的.
icansaymyabc 2008-05-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pengys 的回复:]
1.B.exe的源代码可以修改
2.必须等到B.exe所打开的文件关闭后,删除文件
[/Quote]

你干吗不改写 b.exe, 让他关闭文件后立即删除之, 非得让 a.exe 来干删除文件这事?

你这是运筹学没学好,不会合理统筹安排任务。
icansaymyabc 2008-05-07
  • 打赏
  • 举报
回复
没必要像你想的那样复杂,你在A.exe中调用 notepad.exe 打开文件a.txt进行浏览,A.exe可以立即删除a.txt,而不用管 notepad.exe 是否关闭。
cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
既然这样,你在B.exe打开文件时不要设置共享删除标志就可以了,这样在文件没有关闭之前是删除不掉的,A.exe可以循环删除这个文件,如果删除成功则结束循环,否则Sleep一下再执行删除,如果不想阻塞线程可以用SetTimer来定时执行删除,删除成功后取消定时。此外也可以利用命名事件由B来通知A。
nooning 2008-05-07
  • 打赏
  • 举报
回复
方法很多,使用临界资源,信号量,FileMapping,管道,全局共享内存(DLL).....
jacklzw88 2008-05-06
  • 打赏
  • 举报
回复
event,信号量都可以用
eirssy 2008-05-06
  • 打赏
  • 举报
回复
是呀,先CreateProcess, 然后WaitForSingleObject(B进程句柄),最后删除A.txt
cnzdgs 2008-05-06
  • 打赏
  • 举报
回复
如果B.exe是你自己做的,只要打开文件的时候不指定共享删除标志即可,在文件未关闭的情况下是不能被删除的(DeleteFile失败)。
如果你想等B.exe退出再删除,可以通过CreateProcess或者ShellExecuteEx来加载B.exe,并保留B.exe的进程句柄,当要删除文件前,执行WaitForSingleObject等待进程结束。
pengys 2008-05-06
  • 打赏
  • 举报
回复
谢谢
an_bachelor 2008-05-06
  • 打赏
  • 举报
回复
就是一个进程间通信的问题 你可以用COM、命名管道、Socket等等任何一种方式来同步

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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