VFP中调用程序问题

cqcxyfzjjc 2017-05-29 09:13:42
在VFP中用DECLARE - DLL 命令打开一个文件,如果这个文件可以用多个应用程序打开,如何确定是哪一个应用程序打开这个文件呢?
...全文
536 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqcxyfzjjc 2017-06-05
  • 打赏
  • 举报
回复
  在网上找到了十豆三先生关于“如何关闭一个已知名称的进程”的一段代码,该代码就是枚举当前所有进程,并建立临时表,在表中找到与已知名称相同的进程,同时得到该进程的PID进程号,以此PID号来结束进程。   引入这段代码后问题得以解决,不管是调用了什么外部程序,都可以迅速结束它。   当然,不用这段代码,直接用“RUN /n taskkill /im XXX.exe /f"也可以。   在此再一次感谢版主dkfdtf的热心帮助,也谢谢十豆三先生。
都市夜猫 2017-06-04
  • 打赏
  • 举报
回复
引用 12 楼 cqcxyfzjjc 的回复:
请问:“根据进程名转进程id的转换函数“是哪一个?
没现成的,自己写,参考 http://blog.csdn.net/dkfdtf/article/details/2614284 后面进程管理类(ProcMgr)的 GetImgFile 方法,就是根据 pid 来取文件名的
cqcxyfzjjc 2017-06-03
  • 打赏
  • 举报
回复
请问:“根据进程名转进程id的转换函数“是哪一个?
都市夜猫 2017-06-01
  • 打赏
  • 举报
回复
那就不知是 KillProcessByName,Win10,Office2016 它们哪个的问题 试试 KillApp(进程id),可杀的话,就再加个根据进程名转进程id的转换函数
cqcxyfzjjc 2017-06-01
  • 打赏
  • 举报
回复

我先打开一个DOCX文件,然后在VFP的命令窗口输入KillProcessByName("WINWORD.EXE")执行后仍然毫无反应。
FindExecutable 返回值是42。
都市夜猫 2017-05-31
  • 打赏
  • 举报
回复
我只知道 vfp9 提取文件名部分可以用内部函数,其他版本没用过,不知道是否可以
m.cName = JustFname(Rtrim(m.cExe, Chr(0)))
KillProcessByName(m.cName)
cqcxyfzjjc 2017-05-31
  • 打赏
  • 举报
回复
根据版主dkfdtf 提供的一段程序,略加改动,就可以了: Declare Long FindExecutable in shell32 String, String, String @ m.cExe = Replicate(Chr(0), 260) =FindExecutable(spbf, "", @ m.cExe) KillProcessByName(SUBSTR(Rtrim(m.cExe, Chr(0)),RAT("\", Rtrim(m.cExe, Chr(0)))+1)) 其中“spbf”变量是打开的视频文件所在位置和文件名。 十分感谢版主dkfdtf的帮助。
都市夜猫 2017-05-31
  • 打赏
  • 举报
回复
看看机器上的 默认程序 中的 .doc 是否有默认的关联程序,如果没有,则 FindExecutable 函数会找不到
如果显示的是"未知应用程序",最简单的方法就是让用户点击"更改程序..." 手工指定一个
据说 Word 确实使用了与大部分文件格式不同的打开方式,跟 DDE 有关

都市夜猫 2017-05-31
  • 打赏
  • 举报
回复
KillProcessByName('winword.exe') 这样杀不掉?不会吧 估计是 shell32.dll 找不到默认关联程序, FindExecutable 的返回值 < 32
cqcxyfzjjc 2017-05-31
  • 打赏
  • 举报
回复
  打开视频文件、图像文件、PDF文件以及文本文件都可以用KillProcessByName()退出所关联的应用程序,唯独打开“DOC“、“DOCX”文件(WORD)时,不能退出WINWORD.EXE。   在任务管理器中查找到WINWORD.EXE的PID进程号,然后用KillApp()函数就可以退出WINWORD.EXE了。   不知道是什么原因?
cqcxyfzjjc 2017-05-31
  • 打赏
  • 举报
回复
试了一下,是可以的,最后一句改成KillProcessByName(JustFname(Rtrim(m.cExe, Chr(0))))也行。
都市夜猫 2017-05-30
  • 打赏
  • 举报
回复
那就简单了,只要查出默认的关联 exe:
m.cFile = GetFile()

Declare Long FindExecutable in shell32 String, String, String @
m.cExe = Replicate(Chr(0), 260)
If FindExecutable(m.cFile, '', @ m.cExe) > 32
? Rtrim(m.cExe, Chr(0))
Else
? 'No found'
EndIf
cqcxyfzjjc 2017-05-30
  • 打赏
  • 举报
回复
  没有得到回复,是我没有说清楚吧。   我是用API函数ShellExecute()在表单上打开一个视频文件,因为知道是哪一个应用程序打开了这个视频文件,所以就可以用KillProcessByName("XXX.exe")来终止这个应用程序的运行。如果在另一台个电脑上,因为打开视频文件的应用程序有很多种,就不知道是哪一个应用程序了。如果不能在VFP程序中终止这个应用程序,直到整个VFP程序运行结束,这个播放视频文件的应用程序仍然在运行。   现在想搞清楚在用ShellExecute()打开视频文件时,调用的是哪一个应用程序,以便在退出时立即终止应用程序的运行。

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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