日常工作问题总结(三十二)shellExecute、shellExecuteEx、WinExec、CreateProcess的区别

来源:互联网 发布:org.apache.http.impl 编辑:程序博客网 时间:2024/06/06 00:50

         shellExecute,shellExecuteEx,WinExec,CreateProcess这几个函数都可以启动一个exe(Exp:notepad.exe)文件,但是区别在哪,今天就粗略讲下我查阅资料后的结果。也希望大家提意见,发现不足之处。

       


1.shellExecute

(1.)打开exe应用程序(文件txt也可)

ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL);
(2.)打开url网址
ShellExecute(NULL, "open", "IEXPLORE", strCanonicalHref, NULL,SW_SHOWNORMAL);ShellExecute(NULL,"open",strCanonicalHref,NULL,NULL,SW_SHOWNORMAL);

strCanonicalHref存放的即要打开的网址。一种是以ie浏览器打开,下面一种是使用默认浏览器打开。
(3.)参数解析

●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。
●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。
●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。
●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。
●Directory:用于指定默认目录。
●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。
若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。


2.shellExecuteEx

这个windows函数用的不多,但是要手动提升进程的权限时,就要用这个函数。

SHELLEXECUTEINFO sei = {sizeof(SHELLEXECUTEINFO)};sei.lpVerb = TEXT("runas");sei.lpFile = TEXT("Package.exe");sei.nShow = SW_SHOWNORMAL;if (!ShellExecuteEx(&sei)){DWORD dwError = GetLastError();}

“runas”表示使用管理员权限运行。

3.WinExec

(1.) 函数原型:
UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);


(2.) 参数:
lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。
uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。

(3.)   使用:

WinExec("notepad.exe",SW_SHOW);//运行计事本


4.CreateProcess

if( !CreateProcess( NULL,      (LPSTR)strGamePath.c_str(),      NULL,       NULL,      FALSE,      0,      NULL,      NULL,       &m_ClientSI,      &m_ClientPI) )  {      ZeroMemory( &m_ClientSI, sizeof(m_ClientSI) );      m_ClientSI.cb = sizeof(m_ClientSI);  }

可参考:工作问题总结(三十)共享内存续(当文件映射对象的名称未知时)

5.总结

(1).

winexec() 只用于可执行文件,是一个老函数啦,虽然使用方便,但不推荐!(兼容性也不好)

(2).

shellexcute()是通过windows外壳打开任意文件,非可执行文件自动通过关联的程序打开对于可执行文件,区别不大,不过shellexcute可以指定运行时的工作路径,ShellExecute不仅能打开机器上的文件,还能打开网址。

shellexecuteEx()可用来提升进程的权限。

ShellExecute 与 ShellExecuteEx 的区别是 ShellExecuteEx 可以返回新创建进程的句柄,ShellExecute在创建进程后立即调用 CloseHandle 关闭新进程句柄,而ShellExecuteEx将返回新进程序句柄。

(3).

winexec() 必须有GetMessage或超时之后才返回!CreateProcess和ShellExecute都是直接返回的!

(4).

CreateProcess应该是ShellExecute / ShellExecuteEx 实现的基础。

0 0
原创粉丝点击