五:健壮的C#调用代码(实际考虑,可放在B/S系统中) 完成第4步的C#测试后,细心的读者,可能看到一点问题,那就是如何得到脚本运行后输出的结果,如何给线程中调用的StartConvertData方法传递参数 1:传递参数,此话说来也可用一篇教程告诉大家线程中方法如何来传递参数,现在就讲一个方案,此种方案很多,我采用一个类,初始化这个类,然后调用该类的方法作为线程执行的方法 2:得到脚本的输出结果,使用Process对象的输出重定向,就是说改变输出方向,使脚本不输出到控制台(MS-DOS窗口),而是重定向输出到C#程序中,并采用线程的异步回调方法,显示脚本运行结果。 添加一个新类,类名为ToPdf using System; using System.Diagnostics; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace Doc2Pdf { public class ToPdf { private string strWord = "";//此处的WORD文件不含路径 private string sPath = ""; public string sExecResult = ""; public bool bSuccess = false; public ToPdf(string sParamWord,string sParamPath) { strWord = sParamWord; sPath = sParamPath; } public void StartConvertPDF() { Process proc = new Process(); proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.WorkingDirectory = sPath; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true;//标准输入重定向 proc.StartInfo.RedirectStandardOutput = true;//标准输出重定向 proc.Start(); proc.StandardInput.WriteLine("cscript //nologo "+sPath+"ConvertDoc2PDF.js "+sPath+strWord+ " "+sPath); proc.StandardInput.WriteLine("exit"); sExecResult = proc.StandardOutput.ReadToEnd();//返回脚本执行的结果 proc.WaitForExit(); proc.Close(); } public void EndConvertPDF(System.IAsyncResult ar)//ar参数必须写,是线程执行完成后的回调函数 { if(sExecResult.IndexOf("isuccess")!=-1)bSuccess=true; else if(sExecResult.IndexOf("isfail")!=-1)bSuccess=false; //如果放在B/S系统,你可以在此处写数据库,是成功还是失败,并用一个WEBService程序不断检查数据库,此WEBService程序不放在该回调用函数中 //如果放在C/S系统,回调函数可以不放在类中,以便在窗体程序中调用结果 } } } 改写原来的button1_Click事件中的代码 private void button1_Click(object sender, System.EventArgs e) { ToPdf my2Pdf = new ToPdf("test.doc","c:\\"); ThreadStart thStartConvert = new ThreadStart(my2Pdf.StartConvertPDF); //开始异步调用线程 thStartConvert.BeginInvoke(new AsyncCallback(my2Pdf.EndConvertPDF),null);//设置异步线程的回调函数 //如果需要转换多个WORD,你可以用循环 //如果是B/S系统,可以将本段代码放在ASPX中,并结合客户端的无刷新显示数据的技术,不断访问WEBService程序,以确定PDF是否转换成功或失败 } |