BCB用API函数WinExec在BCB内运行外部程序

 
API(Application Programming Interface,应用程序编程接口)是一套用来控制Windows的各个部件(包括从窗口的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数。在某种程度上API很象Windows的底层代码,其它的编程语言只是提供一种能自动而且更容易访问API的方法。Windows API 函数中包含了成千上万的函数、例程、类型和常数定义它大大扩展了程序的功能。
 
在BCB中调用API函数一般不用引用头文件,也不需要声明。
 

1:用system("")运行(简单,像在CMD命令行一样)

2:用WinExec()运行

3:用CreateProcess运行

4:用ShellExecute运行.


1.WinExec函数是API函数
BCB中对WinExec函数定义在winbase.h中,函数声明为:
WinExec(
    IN LPCSTR lpCmdLine,
    IN UINT uCmdShow
    );
lpCmdLine:要执行的命令行
uCmdShow:定义了以怎样的形式启动程序的常数值,它与ShowWindow
函数的 nCmdShow 参数总结的设置相同:
    SW_HIDE    隐藏窗口,活动状态给令一个窗口
    SW_MINIMIZE    最小化窗口,活动状态给令一个窗口
    SW_RESTORE    用原来的大小和位置显示一个窗口,同时令其进入活动状态
    SW_SHOW    用当前的大小和位置显示一个窗口,同时令其进入活动状态
    SW_SHOWMAXIMIZED    最大化窗口,并将其激活
    SW_SHOWMINIMIZED    最小化窗口,并将其激活
    SW_SHOWMINNOACTIVE    最小化一个窗口,同时不改变活动窗口
    SW_SHOWNA    用当前的大小和位置显示一个窗口,不改变活动窗口
    SW_SHOWNOACTIVATE    用最近的大小和位置显示一个窗口,同时不改变活动窗口
    SW_SHOWNORMAL    与SW_RESTORE相同


下面这个程序段就是在BCB程序内用IE浏览器打开网页
  AnsiString URL_="Explorer.exe " + ADOTable2->FieldValues["URL"];
  const char *my=URL_.c_str(); /将AnsiString转换为Char
  WinExec(my,SW_SHOWMAXIMIZED);
 
调用画图:
        AnsiString URL="mspaint.exe " + CurrentFile;
        char   *chr   =   URL.c_str();//参数
        WinExec(chr,SW_SHOWNORMAL);
 

如果调用成功,这个函数会返回一个不小于31的值,否则调用失败,其返回值的意义如下:

0 系统内存或资源不足

ERROR_BAD_FORMAT .EXE文件格式无效(比如不是32位应用程序)

ERROR_FILE_NOT_FOUND 指定的文件设有找到

ERROR_PATH_NOT_FOUND 指定的路径没有找到

这个函数和system()非常类似,只能运行.EXE文件,这样在WINDOWS中有它不尽人意的地方,比如不能用此方法通过关联的方法打开文件,例如WinExec("1.html",SW_SHOWNA);就不能打开此文档。

 

 

2.

2)ShellExecute()

函数原型:

   HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile,  

   LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );

参数说明:

hwnd 窗口的句柄

lpOperation 进行的操作,如"open","print","explore"分别对应"打开","打印","游览", 也可以为空(""),此时表示进行默认的操作。 lpFile 要操作的文件。

lpParameters 如果lpFile指定的是一个可执行文件则表示参数

lpDirectory 操作进行的目录

nShowCmd 程序的运行方式,其取值见上例。

如果这个函数调用成功,将返回实例的句柄,如果不成功,返回值包含错误信息,由于类型比较多,这里就不一一列举了,详见WinApi的帮助。

这样,上面的例子就可以改变为(假设窗口的句柄为Handle)

ShellExecute(Handle,"open","notepad","c:\\hdc.txt","",SW_SHOWNORMAL);

其实不用那么复杂,因为.TXT的关联程序就是记事本,所以只要这样就可以了

ShellExecute(Handle,"","c:\\hdc.txt","","",SW_SHOWNORMAL);

这个函数和WIN9X中的命令行命令"start"类似,不光可以对文件进行操作,还可以对HTTP、MAILTO等进行操作。这样我们就可以设计有超级链接风格的程序了。

例如在VB中,我们首先声明此函数(可由VB自带的API游览器得到):

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

然后放置两个Label,设置其属性为:

Name lbHomepage lbEMail

Caption http://bcbtop.126.com mailto:hugsnow@126.com

并把字体改为蓝色有下划线,然后分别在两个Label的Click事件中加入以下代码:

ShellExecute(Me.hWnd,"",lbHomepage.Caption,"","",SW_SHOWNORMAL);

ShellExecute(Me.hWnd,"",lbEMail.Caption,"","",SW_SHOWNORMAL);

OK!试试看,如何?够酷的吧!

从上面可看出,ShellExecute的功能要强得多,并且可以完全替代WinExec(),事实上,WinExec()也是为了和以前版本兼容而保留,所以,我们要尽量使用ShellExecute()。其实在WinAPI中,还有一个函数ShellExecuteEx() ,但其使用复杂,又不支持Windows NT,所以这里就不作介绍了,有兴趣的可以自已查询WinAPI帮助。

 

例子:调用画图:ShellExecute(Handle,"open","mspaint",chr,0,SW_SHOW);

 

 

 


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值