求Delphi中createprocess、pipe、winexec、shellexecute的详细用法

求Delphi中createprocess、pipe、winexec、shellexecute的详细用法,第1张

三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。

WinExec 两个参数,前一个指定路径,后一个指定显示方式。

ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。

CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。

三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:

WinExec

这个函数最简单,只有两个参数,原型如下:

UINT WinExec(

LPCSTR lpCmdLine, // 命令路径

UINT uCmdShow // 显示方式

)

使用方法如下:

WinExec("Notepad.exe", SW_SHOW)// 打开记事本

WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED)// 以最大化的方式打开Test.exe

需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。

ShellExecute

原型如下:

HINSTANCE ShellExecute(

HWND hwnd, //父窗口句柄

LPCTSTR lpOperation, // *** 作, 打开方式 "edit","explore","open","find","print","NULL"

LPCTSTR lpFile, //文件名,前面可加路径

LPCTSTR lpParameters, //参数

LPCTSTR lpDirectory,//默认文件夹

INT nShowCmd //显示方式

)

使用方法如下:

ShellExecute(NULL,"open"陆缺历,"C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL)// 打开C:\Test.txt 文件

ShellExecute(NULL, "open", "http://www.google.com",/ NULL, NULL, SW_SHOWNORMAL)// 打开网早搜页www.google.com

ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL)// 打开扮枣目录D:\C++

ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL, SW_HIDE)// 打印文件C:\Test.txt

ShellExecute不支持定向输出。

CreateProcess

原型如下:

BOOL CreateProcess(

LPCTSTR lpApplicationName, //执行程序名

LPTSTR lpCommandLine, // 参数行

//下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性

LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes

LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes

BOOL bInheritHandles, // 继承标志

DWORD dwCreationFlags, // 创建标志

LPVOID lpEnvironment, // 环境变量

LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录

LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性

LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息

)

使用方法如下:

PROCESS_INFORMATION pi

STARTUPINFO si

memset(&si,0,sizeof(si))

si.cb=sizeof(si)

si.wShowWindow=SW_SHOW

si.dwFlags=STARTF_USESHOWWINDOW

bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi)

可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!

关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:

1、定义头文件

在头文件stdafx.h中必须定义以下两个头文件:

#include <shlobj.h>// 可替换为 windows.h

#include <shellapi.h>

如果定义了头文件 #include <windows.h>的话就不必定义 #include <shlobj.h>了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。

2、定义路径

C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:

Disk:\\Directory\\...\\File name

WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED)

ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL)

bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi)

///////////////////////////////////////////////////////////////

WinAPI: WinExec - 运行外部程序

//声明

WinExec(

lpCmdLine: LPCSTR{文件名和参数如没指定路径会按以下顺序查找: 程序目录/当前目录/System32/Windows/PATH环境变量}

uCmdShow: UINT {启动选项}

): UINT

//返回值:

大于 31{调用成功}

等于 0 {内存不足}

ERROR_FILE_NOT_FOUND = 2 {文件名错误}

ERROR_PATH_NOT_FOUND = 3 {路径名错误}

ERROR_BAD_FORMAT = 11{EXE 文件无效}

//uCmdShow 参数可选值:

SW_HIDE= 0{隐藏, 并且任务栏也没有最小化图标}

SW_SHOWNORMAL = 1{用最近的大小和位置显示, 激活}

SW_NORMAL = 1{同 SW_SHOWNORMAL}

SW_SHOWMINIMIZED = 2{最小化, 激活}

SW_SHOWMAXIMIZED = 3{最大化, 激活}

SW_MAXIMIZE= 3{同 SW_SHOWMAXIMIZED}

SW_SHOWNOACTIVATE = 4{用最近的大小和位置显示, 不激活}

SW_SHOW= 5{同 SW_SHOWNORMAL}

SW_MINIMIZE= 6{最小化, 不激活}

SW_SHOWMINNOACTIVE = 7{同 SW_MINIMIZE}

SW_SHOWNA = 8{同 SW_SHOWNOACTIVATE}

SW_RESTORE = 9{同 SW_SHOWNORMAL}

SW_SHOWDEFAULT = 10{同 SW_SHOWNORMAL}

SW_MAX = 10{同 SW_SHOWNORMAL}

--------------------------------------------------------------------------------

//举例, 启动记事本:

procedure TForm1.Button1Click(Sender: TObject)

begin

WinExec('notepad.exe', SW_SHOWNORMAL)

end

用ShellExecute(NULL,"open","Readme.txt",NULL,NULL,SW_SHOWNORMAL)

头文件为shellapi.h

BOOL CreateProcess(

LPCTSTR lpApplicationName,//程序名

LPTSTR lpCommandLine, // 参数

LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全属性

LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性

BOOL bInheritHandles, // 安全属性能否被继承

DWORD dwCreationFlags, // 多个常数的组罩亏帆合,常用CREATE_SUSPENDED使进程悬挂,设置优先权等级

LPVOID lpEnvironment, // 环境变量,一般继承父进程即可设为NULL

LPCTSTR lpCurrentDirectory, // 子进程的当前工作目录

LPSTARTUPINFO lpStartupInfo, // 很大的结构体,用来设定窗口的标题、位置与大小

LPPROCESS_INFORMATION lpProcessInformation //空旁 该结构体四个成员分别为物雹进程、线程的ID、HANDLE

)

第二个参数 应该就是要打开的文件了,好久没用了

头文件time.h

int a=clock()//从这开始计时

这放要测试时间的代码孝戚

int b=clock()//到隐粗这结束

int c=b-a//算出来的巧携陵单位是毫秒


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12169418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存