ShellExecuteWait函数不time wait 等待时间是怎么回事

5023人阅读
windows(30)
ShellExecute函数
ShellExecute函数原型及参数含义如下:
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PC ShowCmd: Integer): HINST;
  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,则表示出现错误。
ShellExecute函数用法:
如何打开一个网页?
  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。&如:ShellExecute(handle,L&open&,L& http://www.&, NULL, NULL, SW_SHOWNORMAL);&ShellExecute()函数在HKEY_CLASSES_ROOT\http\shell\open\command下进行搜索。默认浏览器在注册表HKEY_CLASSES_ROOT\.htm键下的Default设置。
如何激活相关程序,发送EMAIL?
  & &如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文;& 如:ShellExecute(handle,
L&open&, L& mailto:who@mail.?subject=Hello&Body=This is a test&, NULL,NULL, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。ShellExecute()函数在HKEY_CLASSES_ROOT\mailto\shell\open\command下搜索。
&如何打开一个程序?
& & & & ShellExecute(NULL,L&open&,L&notepad.exe&,&&L&c:\\MyLog.log&, NULL, SW_SHOW );
如何用系统打印机打印文档?
& & & & ShellExecute(NULL,L&print&, L&c:\\abc.txt&,NULL, NULL, SW_HIDE);&
如何用系统查找功能来查找指定文件?
& & & & ShellExecute(NULL,L&find&,L&d:\\nish&,&&NULL, NULL, SW_SHOW);
如何启动一个程序,直到它运行结束?
& & & & SHELLEXECUTEINFO ShExecInfo = {0};
& & & & ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
& & & & ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
& & & & ShExecInfo.hwnd = NULL;
& & & & ShExecInfo.lpVerb = NULL;
& & & & ShExecInfo.lpFile =L&c:\\MyProgram.exe&;
& & & & ShExecInfo.lpParameters = NULL;
& & & & ShExecInfo.lpDirectory = NULL;
& & & & ShExecInfo.nShow = SW_SHOW;
& & & & ShExecInfo.hInstApp = NULL;
& & & & ShellExecuteEx(&ShExecInfo);
& & & & WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
& & & &PROCESS_INFORMATION ProcessI
& & & &STARTUPINFO StartupI //This is an [in] parameter
& & & &ZeroMemory(&StartupInfo, sizeof(StartupInfo));
& & & &StartupInfo.cb = sizeof StartupI //Only compulsory field
& & & &if(CreateProcess(L&c:\\winnt\\notepad.exe&, NULL, NULL,NULL,FALSE,0,NULL,&NULL,&StartupInfo,&ProcessInfo))
& & & & & & &WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
& & & & & & &CloseHandle(ProcessInfo.hThread);
& & & & & & &CloseHandle(ProcessInfo.hProcess);
& & & &}&&
& & & &else
& & & & & & &MessageBox(NULL,L&The process could not be started&,NULL,NULL);
如何显示文件或文件夹的属性?&
& & & & SHELLEXECUTEINFO ShExecInfo ={0};
& & & & ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
& & & & ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
& & & & ShExecInfo.hwnd = NULL;
& & & & ShExecInfo.lpVerb = L&properties&;
& & & & ShExecInfo.lpFile = L&c:\\&; //can be a file as well
& & & & ShExecInfo.lpParameters = NULL;
& & & & ShExecInfo.lpDirectory = NULL;
& & & & ShExecInfo.nShow = SW_SHOW;
& & & & ShExecInfo.hInstApp = NULL;
& & & & ShellExecuteEx(&ShExecInfo);
ShellExecuteEx函数
& & & & 此部分转自&
& & & & ShellExecute()有一个难于使用的重大障碍:它不能返回或使你知道新建进程的Handle。也就是说,你不能导出程序并在继续执行之前等待它终止。换句话说ShellExecute()受到了它的16位血统的损害,它仅仅发掘了新的和更有威力的函数CreateProcess()的一个特征子集—WinExec()也支持的子集。然而在4.0以后版本中引进了一个新函数:ShellExecuteEx()。它有一个Shell函数典型的原型,支持多标志,以及上述所有功能,通过提供对进程同步和PIDLs的支持扩展了ShellExecute()。
& & & &&ShellExecuteEx()函数明确地取代了ShellExecute()。它在shellapi.h中声明:BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);
SHELLEXECUTEINFO定义如下:
typedef struct _SHELLEXECUTEINFO
LPCTSTR lpV
LPCTSTR lpF
LPCTSTR lpP
LPCTSTR lpD
HINSTANCE hInstA
// 可选的成员
LPVOID lpIDL
LPCSTR lpC
HKEY hkeyC
DWORD dwHotK
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;
在使用这个结构之前,我们极力建议你把它充填为0,并设置cbSize到结构的实际长度,操作如下:
SHELLEXECUTEINFO
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
正如声明中的注释所说,结构的成员分成了两组。实际上,头一组使ShellExecuteEx()的功能等价于ShellExecute()。而选项成员组使函数更有力,这正是‘Ex’后缀的由来。hwnd, lpVerb, lpFile, lpParameters, lpDirectory 和 nShow成员等价于ShellExecute()的参数,这是我们已经看到的。而hInstApp成员则是一个输出缓冲,这将由ShellExecute()的返回值填写。nShow成员总是表示建立窗口的风格,即使lpFile是一个应用程序,它也仅仅说明应用应该怎样显示。无论lpFile是应用程序还是文档文件,nShow必须总是赋值为SW_型常量,你是知道的,如果设置为0将获得隐藏窗口。
下面是调用ShellExecuteEx()的最简单方法:
SHELLEXECUTEINFO
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = __TEXT(&explorer.exe&);
sei.nShow = SW_SHOW;
sei.lpVerb = __TEXT(&open&);
ShellExecuteEx(&sei);
ShellExecute()中对应参数的成员之一是fMask。它可以是一个或多个下面值的组合:
标志 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &描述
SEE_MASK_CLASSKEY & & & & & & & & & & & & & & & & & & & &应该使用 hkeyClass 成员
SEE_MASK_CLASSNAME & & & & & & & & & & & & & & & & & &应该使用 lpClass 成员
SEE_MASK_CONNECTNETDRV & & & & & & & & & & & &lpFile将被解释成UNC(通用命名习惯)格式的文件名
SEE_MASK_DOENVSUBST & & & & & & & & & & & & & & & &&任何在lpDirectory和lpFile成员中的环境变量都将被展开,例如,%WINDIR% 打开Windows文件夹
SEE_MASK_FLAG_DDEWAIT & & & & & & & & & & & & & & &如果函数启动DDE会话,在返回之前等待它终止。
SEE_MASK_FLAG_NO_UI & & & & & & & & & & & & & & & & &&在错误情况下不显示消息框
SEE_MASK_HOTKEY & & & & & & & & & & & & & & & & & & & & & &应该使用 dwHotkey 成员
SEE_MASK_ICON & & & & & & & & & & & & & & & & & & & & & & & & &应该使用 hIcon 成员
SEE_MASK_IDLIST & & & & & & & & & & & & & & & & & & & & & & & &强制函数使用lpIDList内容代替lpFile
SEE_MASK_INVOKEIDLIST & & & & & & & & & & & & & & & &&引起函数使用lpIDList中指定的PIDL。如果这个成员为NULL,则建立一个lpFile的PIDL,并使用这个PIDL。这个标志重载了SEE_MASK_IDLIST
SEE_MASK_NOCLOSEPROCESS & & & & & & & & & &&用进程Handle设置hProcess成员。lpIDList成员可以包含一个用于代替lpFile的PIDL。hProcess返回导出的HPROCESS类型的新进程handle
附加的特征
& & & & 可选字段适用于某些超出ShellExecute()的附加功能。第一点,也是最重要的一点,可以使用PIDLs来运行应用和打开文件夹。下面是打开‘打印机’文件夹的代码:
LPITEMIDLIST
SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &pidl);
SHELLEXECUTEINFO
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.nShow = SW_SHOW;
sei.lpIDList =
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = __TEXT(&open&);
ShellExecuteEx(&sei);
& & & & &如果指定了SEE_MASK_DOENVSUBST标志,则可以在lpFile和lpDirectory中使用任何环境变量。例如,要打开Windows目录,可以表示为%WINDIR%。
&&&&&&&& 最后,我们获得了由ShellExecuteEx()导出的应用的同步能力。在设置了SEE_MASK_NOCLOSEPROCESS位到fMask成员后,新进程的handle将由hProcess成员返回,因此这一行代码:WaitForSingleObject(sei.hProcess, INFINITE);将导致调用的应用阻塞,等待另一个应用终止。
显示文件属性对话框
&&& SEE_MASK_INVOKEIDLIST标志是一个重要标志,因为这是ShellExecuteEx()另一个优于ShellExecute()的亮点:它允许函数象执行静态动词那样唤醒动态动词。前面解释过,动态动词是运行时由Shell扩展的关联菜单添加的。其工作方法是:如果ShellExecuteEx()不能在静态动词列表中找到这个动词,它就试图寻找给定文件的关联菜单。这个搜索引出IContextMenu接口指针。然后通过接口暴露的方法唤醒动态动词。
&&& 作为这个操作的结论,我们可以很容易地显示文件的属性对话框—与右击文件,然后选择属性显示的对话框相同。这里是一个简单的例子函数:
void ShowFileProperties(LPCTSTR szPathName)
SHELLEXECUTEINFO
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = szPathN
sei.nShow = SW_SHOW;
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = __TEXT(&properties&);
ShellExecuteEx(&sei);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80330次
积分:1167
积分:1167
排名:千里之外
原创:32篇
转载:31篇
(1)(1)(3)(2)(1)(1)(2)(2)(5)(4)(6)(5)(6)(22)(2)JavaScript自定义等待wait函数实例分析
作者:令狐不聪
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了JavaScript自定义等待wait函数,实例分析了自定义等待函数的实现与使用技巧,需要的朋友可以参考下
本文实例讲述了JavaScript自定义等待wait函数用法。分享给大家供大家参考。具体分析如下:
下面是一个js自定义的wait函数,可以暂停程序的执行
function sleep(delay)
var start = new Date().getTime();
while (new Date().getTime() & start + delay);
//wait for 3 seconds
sleep(3000);
希望本文所述对大家的javascript程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具3908人阅读
Visual C++(26)
SHELLEXECUTEINFO ShExecInfo = {0};ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;ShExecInfo.hwnd = NULL;ShExecInfo.lpVerb = NULL;ShExecInfo.lpFile = &E://My Documents//Honeywell//Plan_Estimate//zip//extract.bat&;
ShExecInfo.lpParameters = &&; ShExecInfo.lpDirectory = &E://My Documents//Honeywell//Plan_Estimate//zip//&;ShExecInfo.nShow = SW_HIDE;ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);WaitForSingleObject(ShExecInfo.hProcess, INFINITE);&
注:此处调用的批处理文件中最后须添加exit语句,否则WaitForSingleObject将永远不会返回!
----------------------------------------------------------------------------------------------------------------------------------
另附ShellExecute常用方法((原作:))
Q: 如何打开一个应用程序?
ShellExecute(this-&m_hWnd,&open&,&calc.exe&,&&,&&, SW_SHOW );
ShellExecute(this-&m_hWnd,&open&,&notepad.exe&,
&c://MyLog.log&,&&,SW_SHOW );
正如您所看到的,我并没有传递程序的完整路径。Q: 如何打开一个同系统程序相关连的文档?
ShellExecute(this-&m_hWnd,&open&,
&c://abc.txt&,&&,&&,SW_SHOW );
Q: 如何打开一个网页?
ShellExecute(this-&m_hWnd,&open&,
&&,&&,&&, SW_SHOW );
Q: 如何激活相关程序,发送EMAIL?
ShellExecute(this-&m_hWnd,&open&,
&mailto:&,&&,&&, SW_SHOW );
Q: 如何用系统打印机打印文档?
ShellExecute(this-&m_hWnd,&print&,
&c://abc.txt&,&&,&&, SW_HIDE);
Q: 如何用系统查找功能来查找指定文件?
ShellExecute(m_hWnd,&find&,&d://nish&,
NULL,NULL,SW_SHOW);
Q: 如何启动一个程序,直到它运行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = &c://MyProgram.exe&;
ShExecInfo.lpParameters = &&;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
PROCESS_INFORMATION ProcessI
STARTUPINFO StartupI //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupI //Only compulsory field
if(CreateProcess(&c://winnt//notepad.exe&, NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
MessageBox(&The process could not be started...&);
Q: 如何显示文件或文件夹的属性?
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = &properties&;
ShExecInfo.lpFile = &c://&; //can be a file as well
ShExecInfo.lpParameters = &&;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:120519次
积分:1486
积分:1486
排名:千里之外
原创:20篇
转载:37篇
评论:26条
(1)(2)(1)(1)(2)(12)(5)(1)(5)(4)(1)(1)(3)(4)(13)(1)UNIX环境高级编程(10)
当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件。所以这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即使被调用执行的函数。对于这种信号的系统默认动作时忽略它。对于wait和waitpid函数。
如果其所有子进程都还在运行,则阻塞。
如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
如果它没有任何子进程,则立即出错。
如果进程由于接收到SIGCHLD信号而调用wait,我们期望wait会立即返回。但是如果在随机时间点调用wait,则进程可能会阻塞。
#include &sys/wait.h&
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
两个函数返回值:若成功,返回进程ID;若出错,返回0或-1
这两个函数的区别如下:
在一个子进程终止前,wait使其调用者阻塞,而waitpid有一选项,可使调用者不阻塞。
waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。
如果子进程已经终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态。否则则wait使其调用者阻塞,直到一个子进程终止。如调用者阻塞而且它有多个子进程,则在其某一个子进程终止时,wait就立即返回。因为wait返回终止子进程的进程ID,所以它总能了解是哪一个子进程终止了。
这两个函数的参数statloc是一个整型指针。如果statloc不是一个空指针,则终止进程的终止状态就存放在它所指向的单元内。如果不关心终止状态,则可将该参数指定为空指针。
依据传统,这两个函数返回的整型状态字是由实现定义的。其中某些为表示退出状态,其他位则指示信号编号,有一位指示是否产生了core文件等。POSIX.1规定,终止状态用定义在&sys/wait.h&中的各个宏来查看。有4个互斥的宏可用来取的进程终止的原因,它们的名字都以WIF开始。基于这4个宏中哪一个值为真,就可选其他宏来取得退出状态、信号编号等。这4个互斥的宏表示于下图:
WIFEXITED(status)
若为正常终止子进程返回的状态,则为真。对于这种情况可执行WEXITSTATUS(status),获取子进程传送给exit或_exit参数的低8位
WIFSIGNALED(status)
若为异常终止子进程返回的状态,则为真。对于这种情况,可执行WTERMSIG(status),获取使子进程终止的信号编号。另外,有些实现定义宏WCOREDUMP(status),若已产生终止进程的core文件,则它返回真
WIFSTOPPED(status)
若为当前暂定子进程的返回的状态,则为真。对于这种情况,可执行WSTOPSIG(status),获取使子进程暂停的信号编号
WIFCONTINUEO(status)
若在作业控制暂停后已经继续的子进程返回了状态,则为真,仅用于waitpid
#include &apue.h&
#include &sys/wait.h&
void pr_exit(int status)
if(WIFEXITED(status))
printf(&normal termination, exit status = %d\n&,WEXITSTATUS(status));
else if(WIFSIGNALED(status))
printf(&abnormal termination, signal number = %d%s\n&,WTERMSIG(status),
#ifdef WCOREDUMP
WCOREDUMP(status) ? & (core file generated)& : &&);
else if(WIFSTOPPED(status))
printf(&child stopped, signal number = %d\n&,WSTOPSIG(status));
int main(void)
if((pid = fork()) & 0)
err_sys(&fork error&);
else if(pid == 0)
if(wait(&status) != pid)
err_sys(&wait error&);
pr_exit(status);
if((pid = fork()) & 0)
err_sys(&fork error&);
else if(pid == 0)
if(wait(&status) != pid)
err_sys(&wait error&);
pr_exit(status);
if((pid = fork()) & 0)
err_sys(&fork error&);
else if(pid == 0)
status /=0;
if(wait(&status) != pid)
err_sys(&wait error&);
pr_exit(status);
}运行程序:
# ./a.out&
normal termination, exit status = 7
abnormal termination, signal number = 6
abnormal termination, signal number = 8
我们从WTERMSIG中打印信号编号。可以查看&signal.h&头文件验证SIGABRT的值为6,SIGFPE的值为8.
正如前面所述,如果一个进程有几个子进程,那么只要有一个进程终止,wait就返回。POSIX.1定义了waitpid函数用于等待一个指定的进程终止,对于waitpid函数中pid参数的作用解释如下。
等待任一子进程。此种情况下,waitpid与wait等效。
等待进程ID与pid相等的子进程。
等待组ID等于调用进程组ID的任一子进程。
等待组ID等于pid绝对值的任一子进程。
waitpid函数返回终止子进程的进程ID,并将该子进程的终止状态放在由statloc指向的存储单元中。对于wait,其唯一的出错是调用进程没有子进程。但是对于waitpid,如果指定的进程或进程组不存在,或者参数pid指定的进程不是调用进程的子进程,都可能出错。
options参数使我们能进一步控制waitpid的操作,此参数或者时0,或者是下表的常量值按或运算的结果。
WCONTINUED
若实现支持作业控制,那么由pid制定的任一子进程在停止后已经继续,但其状态尚未报告,则返回其状态
若由pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回值为0
若某实现支持作业控制,而由pid指定的任一子进程已处于停止状态,并且其状态自停止以来还未报告过,则返回其状态,WIFSTOPPED宏确定返回值是否对应于一个停止的子进程。
waitpid函数提供了wait函数没有提供的3个功能。
(1)waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态。
(2)waitp提供了一个wait的非柱塞版本。有时希望获取一个子进程的状态,但不想阻塞。
(3)waitpid通过WUNTRACED和WCONTINUED选项支持作业控制。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:27543次
积分:1032
积分:1032
排名:千里之外
原创:79篇
(2)(12)(23)(2)(13)(3)(24)

我要回帖

更多关于 sem wait等待超时 的文章

 

随机推荐