关键词:Delphi 2010,Winexec
本人在使用Delphi 2010进行功能开发时,需要调用Windows程序,本人通过使用Winexec函数以实现本人要求。
1、问题
本人在使用Winexec函数发现一个问题,就是Winexec(exePath,ShowCmd)命令中,exePath必须是固定的,无法通过变量传递。
即winexec支持下面命令:
winexec('calc.exe',SW_show);
但不支持下面命令:
Var filename:string;
Filename:= 'calc.exe';
Winexec(filename,SW_NORMAL) ;
2、处理过程
通过变量传递方式,系统在编译时就会报错: E2010 Incompatible types: 'string' and 'PansiChar。把filename定义为pchar类型也是报同样错误。
根据网上资料加上pchar函数(Winexec(pchar(filename),SW_NORMAL) ;),系统报错:Incompatible types: 'Char' and 'AnsiChar'。
由此,本人判断是Delphi 2010与Delphi 7等有差异,故本人又使用函数pansichar、pansistring函数替代pchar,但还是不行。因为使用pansistring函数则是报错误信息Incompatible types: 'Char' and 'AnsiChar'。而使用pansichar函数、编译时系统不报错,但就是不执行命令行,通过调测发现经过pansichar函数转换后,命令行只保留了一个字符。
3、解决方案
因此,本人只能采用变通方式达到本人目的。本将需要执行的文件命令放到一个固定位置、名称的批处理文件(.bat)文件中,Winexec函数中的filename变更为批处理文件名即可。
在使用此方法时,本人发现一个问题,批处理文件的命令行中不能有空格,例如:目录‘…\RAD Studio\…’中有空格,该命令行将无法执行。
因为,本文件为批处理文件,所以、本人在批文件中生成一组命令(先将目录切换到目标路径,在目录路径执行可执行文件)达到了此目标。
4、具体操作
以执行delphi工具为例,具体实现方法如下:
1 添加memo控件,并设置visible=false;
2 编写代码,如下:
// step 1:参数定义
Filepath:='D:\SoftWare\Embarcadero\RAD Studio\7.0\bin';
filename:='bds.exe';
// step 2:生成批处理文件
Memo1.Lines.Clear;
Memo1.Lines.Add(copy(filepath,1,1)+':'); // 变更盘符
memo1.Lines.Add('cd '+ filepath); // 进入目标文件目录
memo1.lines.add(filename); // 执行目标文件
memo1.lines.SaveToFile('C:\exec1.bat');
// step 3:执行批处理文件
winexec('C:\exec1.bat', SW_ show);
// step 4:删除批处理文件
deletefile('C:\exec1.bat');
说明1 本人利用memo存放命令行,其好处在于其SaveToFile可以将memo的信息存放到目标文件中,不需要对文件执行打开、关闭等命令,比较简单;
说明2 本例中,批处理文件的路径+文件名:'C:\exec1.bat';
说明3 本例中,参数信息内容如下:
Filepath:='D:\SoftWare\Embarcadero\RAD Studio\7.0\bin';
filename:='bds.exe';
说明4 本人通过一组dos命令行、实现文件执行操作,本例执行后,批处理文件中命令行信息示例如下(头两行命令是为了解决目录中存在空格而增加的,如果确认目录中没有空格,可以就用一个命令行即可,如:D:\SoftWare\Embarcadero\RADStudio\7.0\bin\bds.exe):
D:
cd D:\SoftWare\Embarcadero\RAD Studio\7.0\bin
bds.exe
本文目标,在delphi 2010环境下,通过中间文件(批处理文件)方式,实现在winexec中支持可变文件名(含文件目录、且支持目录中允许空格字符存在)的目的。