首页 新闻 会员 周边 捐助

c# winform 中运行另外一个EXE程序,异常问题

0
悬赏园豆:20 [已解决问题] 解决于 2024-01-12 20:28

我有一个winform程序,内部会调用一个叫 A.exe 的程序。这个A.exe 的程序内部又会执行一个B.bat 的批处理文件。但是每次执行 B.bat 文件的时候,都会报如下错误。
System.ComponentModel.Win32Exception (0x80004005): 系统找不到指定的文件。在 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)

但是我双击运行 A.exe ,又没有问题。

我查阅了一下,说是权限问题,但是我的winform,A.exe 都是设置的以管理员身份运行,并且在代码里面运行 A,exe 程序的时候,也是按照网上给的写法:

            pro.StartInfo.FileName = filePath;
            pro.StartInfo.UseShellExecute = true;
            pro.StartInfo.CreateNoWindow = true;
            pro.StartInfo.Verb = "runas";
            return pro.Start();

但就是不行。有大佬指点一下吗?
winform 和 A.exe 都是 .net framework 4.6.1

热敷哥的主页 热敷哥 | 初学一级 | 园豆:160
提问于:2024-01-12 09:57
< >
分享
最佳答案
0

这里推荐你附加进程调试

收获园豆:20
赤原 | 菜鸟二级 |园豆:397 | 2024-01-12 10:13
其他回答(2)
0

我自己 按照你的逻辑 亲自试了一下,解决的办法是,设置一下工作路径就行了
设置一下 WithWorkingDirectory,这个要用绝对路径

需要格局 | 园豆:2145 (老鸟四级) | 2024-01-12 11:06
0

感谢楼上两个大哥,我终于搞好了。

首先,我的winform 和 A.exe 都是 ,net framework 4.6.1
其次,我的winform之前是这样写的:
pro.StartInfo.FileName = filePath;
pro.StartInfo.UseShellExecute = true;
pro.StartInfo.CreateNoWindow = true;

A.exe 是这样写的:
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
proc.StartInfo.FileName = "xxxx.bat";

表现是:双击A.exe时,xxxx.bat 可以正常运行。但是通过winform调用A.exe时,xxxx.bat 执行的时候报错:
System.ComponentModel.Win32Exception (0x80004005): 系统找不到指定的文件。在 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)

最终的解决办法是: 把 winform 和 A.exe 的 pro.StartInfo.UseShellExecute 都设置成 false

但是我不理解的是,UseShellExecute 这个字段的值,.net framework 下默认就是 true,也就是说,虽然我的 A.exe 没有设置,但是也是 true 啊。为啥非要把 winform 和 A.exe 都设置成false才行呢。。。两边都是 true 为啥就不行呢。。。

热敷哥 | 园豆:160 (初学一级) | 2024-01-12 11:49

我们也做过A.exe 调用B.exe,然后把只是我们把A、B放在同级目录下,然后所需的资源也在相同目录下,通过相对路径实现调用

支持(0) 反对(0) echo_lovely | 园豆:1546 (小虾三级) | 2024-01-12 13:45

自己回复自己吧,又研究了一下,核心问题就是路径问题。
A.exe 是这样写的:
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
proc.StartInfo.FileName = "xxxx.bat";
双击A.exe运行时,Environment.CurrentDirectory 拿到的是 A.exe 的 路径。
但是通过 form 运行 A.exe 时,拿到的是 form 的路径。所以运行 xxxx.bat 时就找不到文件了。

支持(0) 反对(0) 热敷哥 | 园豆:160 (初学一级) | 2024-01-15 10:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册