最近着手一个c#项目, 在此项目的一个模块中使用c#启动外部qt quick exe, 原来启动的第三方程序是个c#窗口程序, 启动是正常的,现在目标是启动其他的第三方程序, 不巧此程序是windows下qt quick程序,反编译启动程序得到c#代码后, 修改了目标启动程序为qt quick程序,结果重新编译成功后一直出发不了qt quick程序,查找到c#中启动程序的代码段为:
using (Process process = new Process()) {
var s = System.IO.Path.Combine(workPath, exeName);
p.StartInfo.FileName = s;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
p.Start();}
将整个项目程序重新运行一遍,在任务管理器中发现qt quick程序是有启动的,不过启动没几秒就自动关闭了, 初看下还以为是其他模块因为达成某种条件触发了主动关闭qt quick程序的事件,但是实际上并没有这样的处理。 这种情况只能是qt quick程序自己异常退出了,windows下只能看看是否可以拿到qt quick程序的dump文件, 然后再分析!有一个工具是可以捕捉windows系统下大部分软件异常退出的dump文件的, 不过因为时间的原因就不打算做这样的处理, 根据经验来看很有可能是qt quick程序因为缺少了依赖库, 于是索性把目标qt quick 程序开发工程中打包好的所有依赖都拷贝到启动程序的同一个目录下,重新测试发现还是启动不了, 于是将之前的那段启动代码改成下面这样:
using (Process process = new Process()){
string fileName = Path.Combine(workPath, exeName);
process.StartInfo.FileName = fileName;
process.StartInfo.UseShellExecute = true;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.WorkingDirectory = workPath;
process.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
process.Start();
result = true;
}
手动设置了qt quick 程序的工作目录, 重新运行还是不行, 还是启动了一会就会自动关闭。想了一下, 项目中启动程序其实也是由其他程序启动的, 项目中多个模块的是链式启动的, 一环一环下来, 根据经验, 将qt quick程序重新编译为管理员权限启动, 再放到启动程序目录下, 重新测试, 启动成功!汗~ 如果程序中有读写了计算机中的文件、数据库, 最好能给程序管理员权限运行。