PB中使用run()与windows API函数shellExecute()打开外部EXE程序(打开指定文件或传参)
PB中我们一般使用如下方法打开外部EXE程序,并且进行有限的操作。
使用run()函数
示例代码:
run("notepad.exe") run("c:\123\show.exe 参数1|参数2")
如果我们想用记事本打开一个现有的文本文件呢?我们可以轻松地使用脚本,如下所示:
string ls_namafile = 'd:\panggilnotepad.txt' run("notepad.exe"+ls_namafile)
上面的脚本将调用记事本并打开文件。但是如果我们不知道用于打开文本文件(*.Txt)的默认应用程序是notepad++,该怎么办。如果我们直接使用运行("panggilnotepad.txt"),它将无法正常运行。
使用windows API函数shellExecute()
函数的定义如下:
FUNCTION ulong ShellExecute(ulong hwnd,ref string lpOperation,ref string lpFile,ref string lpParameters,ref string lpDirectory,ulong nShowCmd) LIBRARY "shell32.dll" ALIAS FOR "ShellExecuteA"
以下是一个简单的示例:(这是窗口中一个按纽的click事件的代码)
ulong hwnd,nShowCmd hwnd=Handle(parent) nShowCmd=1 string lpOperation,lpFile,lpParameters,lpDirectory lpOperation="open" lpFile="hh.exe" lpParameters="help.chm" SetNull(lpDirectory) ShellExecute(hwnd,lpOperation,lpFile,lpParameters,lpDirectory,nShowCmd)
拓展
在PB中调用外部程序并判断其运行结束后再执行后续代码。对于这种情况,我们可以借助API函数FindWindowA()、IsWindow()和PB本身函数yield()来解决。
声明API函数:
Function long FindWindowA (String lpClassName , String lpWindowName ) Library "user32.dll" Function boolean IsWindow (Long hwnd ) Library "user32.dll"
调用:
ulong ll_handle int li_loop SetPointer(HourGlass!) //设置鼠标指针 //运行备份数据库程序dbbackup,并使其最小化 run("dbbackup -c ~"uid=dba;pwd=sql; dbf=D:/Sybase/Adaptive Server Anywhere 6.0/asademo.db~" d:/backup", Minimized!) ll_handle = 0 //循环至dbbackup窗口打开 Do While ll_handle = 0 ll_handle = FindWindowA("tty","dbbackup") yield() // loop //等待dbbackup窗口关闭 Do While isWindow(ll_handle) Yield() Loop //应用执行完成 MessageBox("提示信息", "备份完成!")