GVKun编程网logo

against parallel execution in shell (flock)

8

本文的目的是介绍againstparallelexecutioninshell(flock)的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于API函数ShellExecu

本文的目的是介绍against parallel execution in shell (flock)的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于API函数ShellExecute与ShellExecuteEx用法、Artifact tlks: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.Execut...、azkaban Execute Flow选项卡里 FailureOptions Finish All Possible的具体使用、c# – ProcessStartInfo.UseShellExecute = true并等待进程退出的知识。

本文目录一览:

against parallel execution in shell (flock)

against parallel execution in shell (flock)

http://blog.chinaunix.net/uid-25324849-id-3077304.html

#! /bin/bash -

set -x

#exec 6<>"mylockfile.sh"

{

flock -n 6

#[ "$?" -eq "1" ] && {echo "fail"; exit;}

if [ "$?" -eq "1" ]; then

echo "fail";

exit;

fi

echo $$

sleep 10

} 6<>"mylockfile.sh"


在函数或者子shell里执行flock,返回之后已不再持有锁,需要保护的代码应该放在上面sleep前后。

API函数ShellExecute与ShellExecuteEx用法

API函数ShellExecute与ShellExecuteEx用法

ShellExecute:

1.函数功能:
你可以给它任何文件的名字,它都能识别出来并打开它。
2.函数原型:

HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
); 

3.参数说明:
hwnd:
用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。
lpOperation:
用于指定要进行的操作。
“open”操作表示执行由lpFile参数指定的程序,或打开由lpFile参数指定的文件或文件夹;
“print”操作表示打印由lpFile参数指定的文件;
“explore”操作表示浏览由lpFile参数指定的文件夹。
当参数设为NULL时,表示执行默认操作“open”。
lpFile:
用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。
lpParameters:
若lpFile参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为NULL.
lpDirectory:
用于指定默认目录.
nShowCmd:
若lpFile参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。
这个参数常用的常数:

SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同
若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。
SW_HIDE 隐藏窗口,活动状态给另一个窗口 
  SW_MINIMIZE 最小化窗口,活动状态给另一个窗口 
  SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
  SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
  SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
  SW_SHOWMINIMIZED 最小化窗口,并将其激活 
  SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
  SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
  SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
  SW_SHOWNORMAL 与SW_RESTORE相同

ShowCmd 参数可选值: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}
View Code

4.使用方法:
例如:
ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);
用缺省的位图编辑器打开一个叫iloveu.bmp的位图文件,这个缺省的位图编辑器可能是 Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。
这个函数能打开任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute 返回打开文件的应用的实例句柄。
ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL);
这个代码使你能访问微软的主页。当ShellExecute遇到文件名前面的“http:”时,可以判断出要打开的文件是Web文件,随之启动Internet Explorer 或者 Netscape Navigator 或者任何你使用的别的浏览器打开文件。
ShellExecute还能识别其它协议,象FTP、GOPHER。甚至识别“mailto”,如果文件名指向“mailto:zxn@hq.cninfo.net”,它启动电子邮件程序并打开一个待编辑的新邮件,例如:
ShellExecute(NULL, "open",“mailto:zxn@hq.cninfo.net”, NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口。
总之,ShellExecute函数就是如此简单地打开磁盘文件和Internet文件。如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,ShellExecute将能打印文件和打开文件夹。ShellExecute还有一个扩展函数ShellExecuteEx,所带参数中有一个特殊的结构,功能更强,或者任何你使用的别的浏览器打开文件。
==========================================================================================================================
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","http://www.google.com","","", SW_SHOW );

Q: 如何激活相关程序,发送EMAIL?

ShellExecute(this->m_hWnd,"open","mailto:nishinapp@yahoo.com","","", 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 ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //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);
} 
else
{
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);

Windows CE ShellExecuteEx 不支持 SEE_MASK_IDLIST 或 SEE_MASK_INVOKEIDLIST 标志。 因此,不能使用通过调用系统文件夹中打开 Windows 资源管理器的 SHGetSpecialFolderLocation 所得到的 LPITEMIDLIST。
相反,使用下面的类 ID,您要打开调用 ShellExecuteEx 时的系统文件夹:
Control Panel - {000314FE-0000-0000-C000-000000000046}
My Computer - {000214A0-0000-0000-C000-000000000046}
Recycle Bin - {000214A1-0000-0000-C000-000000000046}
Databases - {000214A4-0000-0000-C000-000000000046}
您可以在控制面板文件夹中打开 Windows 资源管理器的实例使用以下函数。 请注意 CLSID 必须被括在引号。

BOOL WINAPI OpenControlPanel ()
{
TCHAR szControlPanel[] = L"""
{000314FE-0000-0000-C000-000000000046}""";
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof (SHELLEXECUTEINFO);
sei.lpVerb = L"Open";
sei.lpFile = szControlPanel;
sei.nShow = SW_SHOW;
sei.hInstApp = hInstance;
return ShellExecuteEx (&sei);
}

示例:
1:打开EXE

SHELLEXECUTEINFO lpExecInfo = {0};
lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
lpExecInfo.lpVerb = L"Open"; 
lpExecInfo.hwnd = NULL; 
lpExecInfo.lpFile = L"calc.exe";
lpExecInfo.lpDirectory = L"\\windows"; 
lpExecInfo.nShow = SW_SHOW; 
lpExecInfo.lpParameters = NULL; 
lpExecInfo.hInstApp = NULL; 
ShellExecuteEx(&lpExecInfo);
View Code

2:打开指定文件夹

SHELLEXECUTEINFO lpExecInfo = {0};
lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; 
lpExecInfo.lpVerb = L"Open"; 
lpExecInfo.hwnd = NULL; 
lpExecInfo.lpFile = L"fexplore.exe";
lpExecInfo.lpDirectory = NULL;//L"\\windows"; 
lpExecInfo.nShow = SW_SHOW; 
lpExecInfo.lpParameters = L"\\Windows\\“开始”菜单\\程序"; 
lpExecInfo.hInstApp = NULL; 
ShellExecuteEx(&lpExecInfo);
View Code

Q: 如何打开一个应用程序?

ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );或 
ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );正如您所看到的,我并没有传递程序的完整路径。
View Code

Q: 如何打开一个同系统程序相关连的文档?

ShellExecute(this->m_hWnd,"open",
"c:\\abc.txt","","",SW_SHOW );Q: 如何打开一个网页? 
ShellExecute(this->m_hWnd,"open",
"http://www.google.com","","", SW_SHOW );Q: 如何激活相关程序,发送EMAIL? 
ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", 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 ProcessInfo; 
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //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);
} 
else
{
MessageBox("The process could not be started...");
}
View Code

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);
View Code

如何判断通过ShellExecute执行的应用程序已经执行完毕
方法一:

SHELLEXECUTEINFO sei; 
memset(&sei, 0, sizeof(SHELLEXECUTEINFO));

sei.cbSize = sizeof(SHELLEXECUTEINFO); 
sei.fMask = SEE_MASK_NOCLOSEPROCESS; 
sei.lpVerb = _T("open"); 
sei.lpFile = _T("aa.exe"); 
sei.nShow = SW_SHOWDEFAULT; 
ShellExecuteEx(&sei);

WaitForSingleObject(sei.hProcess, INFINITE); 
CloseHandle(sei.hProcess); 
View Code

方法二:

//通过CreateProcess创建一个进程,然后进行等待。
STARTUPINFO si; 
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) ); 
si.cb = sizeof(si); 
ZeroMemory( &pi, sizeof(pi) );

// 创建子进程 
if( !CreateProcess( NULL, // No module name (use command line). 
"MyChildProcess", // Command line. 
NULL, // Process handle not inheritable. 
NULL, // Thread handle not inheritable. 
FALSE, // Set handle inheritance to FALSE. 
0, // No creation flags. 
NULL, // Use parent''s environment block. 
NULL, // Use parent''s starting directory. 
&si, // Pointer to STARTUPINFO structure. 
&pi ) // Pointer to PROCESS_INFORMATION structure. 
) 
{ 
ErrorExit( "CreateProcess failed." ); 
}

// 等待子进程退出 
WaitForSingleObject( pi.hProcess, INFINITE );

// 关闭句柄 
CloseHandle( pi.hProcess ); 
CloseHandle( pi.hThread );
View Code

 

WinAPI: ShellExecute - 打开外部程序或文件
ShellExecute(
hWnd: HWND; {指定父窗口句柄}
Operation: PChar; {指定动作, 譬如: open、runas、print、edit、explore、find }
FileName: PChar; {指定要打开的文件或程序}
Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil} Directory: PChar; {缺省目录} ShowCmd: Integer {打开选项} ): HINST; {执行成功会返回应用程序句柄; 如果这个值 <= 32, 表示执行错误}
返回值可能的错误有: = 0 {内存不足}

ERROR_FILE_NOT_FOUND = 2; {文件名错误}
ERROR_PATH_NOT_FOUND = 3; {路径名错误}
ERROR_BAD_FORMAT = 11; {EXE 文件无效}
SE_ERR_SHARE = 26; {发生共享错误}
SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效}
SE_ERR_DDETIMEOUT = 28; {超时}
SE_ERR_DDEFAIL = 29; {DDE 事务失败}
SE_ERR_DDEBUSY = 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务}
SE_ERR_NOASSOC = 31; {没有相关联的应用程序}

SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同

//Operation参数可选值:
open:{操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;}
runas:{runas是微软未列入MSDN文档的TOKEN,也就是以管理员模式运行为 } 
print:{操作表示打印由FileName参数指定的文件}
edit:{}
explore:{操作表示浏览由FileName参数指定的文件夹}
find:{}
nil:{当参数设为nil时,表示执行默认操作“open”}

//ShowCmd 参数可选值:
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}
View Code

//举例说明更多问题(别忘了 uses ShellAPI;):
{譬如用记事本打开一个文件}

View Code

{第一个参数是用来当作错误提示窗口的父窗口的, 不能是 nil, 可以是 0(也就是桌面窗口)}

View Code

{第二个参数如果是 nil, 也会默认位 open}

View Code

{文件路径可以放在参数五}

View Code

{把参数三直接指定为要打开的文件, 文件将用对应默认程序打开; 次数参数四应为 nil}

View Code

{如果文件在: 程序目录/当前目录/System32/Windows/PATH环境变量中, 参数五也可以 nil}

View Code

{如果参数三是个文件, 可以用参数二命令打印}

View Code

{用 IE 打开网页}

View Code

{用火狐打开网页}

View Code

{用默认浏览器打开网页}

View Code

{还是用默认浏览器打开网页}

View Code

 调出windows任务管理器

delphi 如何调出windows任务管理器
uses shellapi;
begin
ShellExecute (HWND(nil), ''open'', ''taskmgr'', '''', '''', SW_SHOWNORMAL);
end;
View Code

启动和关闭外部应用程序

⑴ 要启动外部应用程序,可以通过调用api函数winexec来实现。该函数用于运行指定的应用程序。下面介绍一下该函数所需的参数和返回值:
uint winexec(
 lpcstr lpcmdline, file://命令行指针
 uint ucmdshow file://应用程序的窗口风格
);
  如果成功,返回值大于31。否则可能返回下列结果:
  0 系统内存或资源不足
  error_bad_format 该*.exe文件无效
  error_file_not_found 没找到指定的文件
  error_path_not_found 没找到指定路径
  ⑵ 通过编写标题为“启动外部应用程序”组件的onclick事件,来实现外部应用程序的启动,代码如下:
procedure tform1.button1click(sender: tobject);
var
str: string; file://存储指定的应用程序文件名begin
if opendialog1.execute then file://选择要调用的外部可执行程序
begin
str := opendialog1.filename; file://获取可执行文件名
winexec(pchar(str), sw_shownormal); file://启动指定的可执行程序
end;
end;
  3. 关闭已开启的外部应用程序
  ⑴ 通过调用两个api函数,可以实现该功能。这两个函数分别为:
  ① findwindow函数 该函数用于查找与指定的类名和窗口名相匹配的高层窗口,如果查找成功,返回非0值,否则返回0。
  ② sendmessage函数 此函数向一个或多个窗口发送指定的消息。在此通过发送wm_close消息来关闭指定的外部应用程序。
  ⑵ 通过编写标题为“关闭已开启的外部应用程序”组件的onclick事件,来关闭已开启的外部应用程序。代码如下:
procedure TmainForm.Button1Click(Sender: TObject);
var
  hwndclose: hwnd; //存储指定的外部应用程序窗口句柄
  str: string; //存储指定的外部应用程序的窗口名
begin
  str:= inputbox(''提示'',''请输入应用程序名:'',''''); //file://获取要关闭的应用程序窗口名
  if str <>'''' then
  begin
  //根据窗口名查找要关闭的窗口句柄
  hwndclose := findwindow(nil, pchar(str));
  if hwndclose <> 0 then //如果查找成功,则发送消息,关闭指定的窗口
  begin
    sendmessage(hwndclose,wm_close,0,0);
  end
  else //否则,给出提示信息
  begin
    showmessage(''没找到指定的应用程序,所以无法关闭!'');
  end;
end;
end;
View Code

等待执行完一个外部程序再执行另一个程序

View Code

调用外部程序的集中方法

Delphi调用外部程序

WinExec主要运行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);

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}


ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。
首先必须引用shellapi.pas单元:uses ShellAPI; 

1.标准用法 
  ShellExecute函数原型及参数含义如下: 
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall; 
  ●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函数的标准用法,下面将介绍它的特殊用法。 

2.特殊用法 
  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。 
  格式一:http://网站域名。 
  如:ShellExecute(handle, ‘open’, http:// ;  http://www.neu.edu.cn/’/, nil, nil, SW_SHOWNORMAL); 
  格式二:http://网站域名/网页文件名。 
  如:ShellExecute(handle, ‘open’, http://;  www.neu.edu.cn/default.htm’,nil,nil,  SW_SHOWNORMAL); 
  如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。 
  格式一:mailto: 
  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口。 
  格式二:mailto:用户账号@邮件服务器地址 
  如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。 
  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文 
  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。 
例子(delphi): 
在一个应用程序调用c:Project1.exe; 
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串内容’,nil, SW_SHOWNORMAL); 
在Project1.exe里可以调用: 
procedure TForm1.FormCreate(Sender: TObject); 
var i:integer; 
begin 
for i:=1 to paramcount do 
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i)); 
end;

最后的那个参数,为窗口指定可视性方面的一个命令。 
请用下述任何一个常数 
SW_HIDE 隐藏窗口,活动状态给令一个窗口 
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
SW_SHOWMINIMIZED 最小化窗口,并将其激活 
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
SW_SHOWNORMAL 与SW_RESTORE相同 

 function   ShellExecuteEx(lpExecInfo:   PShellExecuteInfo):BOOL;   stdcall;   
 //使用一个结构传递参数,可以得到被调用者的进程句柄,可以用WaitForSingleObject(lpExecInfo^.hProcess,INFINITE)来等待它结束

 如果要得到被运行的程序的进程句柄,以便于等待它结束再继续执行,就要用ShellExecuteEx,CreateProcess和CreateProcessAsUser。
View Code

ShellExecute的妙用

ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。
有几个API函数都可以实现这些功能,但是在大多数情况下ShellExecute是更多的被使用的,同时它并不是太复杂。下面举例说明它的用法。
开始一个新的应用程序 
ShellExecute(Handle, ''open'', PChar(''c:\test\app.exe''), nil, nil, SW_SHOW);
打开记事本,并打开一个文件(系统能识别记事本应用程序的路径,因此我们不必使用绝对路径)
ShellExecute(Handle, ''open'', PChar(''notepad''), PChar(''c:\test\readme.txt''), nil, SW_SHOW);
打印一个文档
ShellExecute(Handle, ''print'', PChar(''c:\test\test.doc''), nil, nil, SW_SHOW);
注意:可能你会看到word暂时的被打开,但它会自动关闭。 
打开一个HTML页面 
ShellExecute(Handle, ''open'', PChar(''http://bbs.e-0631.cn''), nil, nil, SW_SHOW); 
你能通过一个已经注册的文件类型来打开应用程序 
ShellExecute(Handle, ''open'', PChar(''c:\test\readme.txt''), nil, nil, SW_SHOW); 
用windows Explorer 打开一个目录
ShellExecute(Handle, ''explore'', PChar(''c:\windows)'', nil, nil, SW_SHOW);
运行一个DOS命令并立即返回
ShellExecute(Handle, ''open'', PChar(''command.com''), PChar(''/c copy file1.txt file2.txt''), nil, SW_SHOW);
运行一个DOS命令并保持DOS窗口存在
ShellExecute(Handle, ''open'', PChar(''command.com''), PChar(''/k dir''), nil, SW_SHOW);
ShellExecute详解
ShellExecute函数用于打开或者打印一个指定的文件。指定的文件必须是可执行文件或者文档文件。 
HINSTANCE ShellExecute(HWND hwnd, // handle to parent window 
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename or folder name string
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters  
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd  // whether file is shown when opened)

* Params(参数解释)
Hwnd 
指定父窗口句柄。这个窗口接收工程产生的所有消息。例如:一个工程可以通过消息框报告错误。 
lpOperation
以一个以null结束的字符串描述操作的执行。以下的操作字符串是有效的: 
行号 参数 含义 
1 “open” 函数打开由lpFile指定的文件。这个文件必须是可执行文件或者文档文件。文件夹必须是可打开的文件夹。
2 “print” 函数打印由lpFile指定的文件。这个文件应该是文档文件。如果指定的文件是可执行文件,函数将以open的方式打开这个文件。
3 “explore” 函数将搜索由lpFile指定的文件夹。
lpOperation参数如果为null,函数将以open的方式打开由lpFile指定的文件。 
lpFile
以一个null结束的字符串描述打开或者打印指定的文件,或者打开或者搜索指定的 文件夹。函数可以打开一个指定的文件或者文件夹,也可以打印一个文档文件。
lpParameters
如果lpFile指定的是一个可执行文件,lpParameters以一个以null结束的字符串指定该执行文件传给应用软件的参数。
行号 参数 含义
1 SW_HIDE 隐藏这个窗体,并激活其他窗体。
2 SW_MAXIMIZE 最大化指定的窗体。
3 SW_MINIMIZE 最小化指定的窗体,并按顺序激活最上层的窗体。
4 SW_RESTORE 激活并显示窗体。如果窗体为最小化或者最大化,窗体恢复到原始大小和位置。应用程序当恢复一个最小化的窗体时将指定标记。
5 SW_SHOW 以当前的大小和位置激活并显示窗体。
6 SW_SHOWDEFAULT
7 SW_SHOWMAXIMIZED 激活并最大化显示窗体。
8 SW_SHOWMINIMIZED 激活并最小化现实窗体。
9 SW_SHOWMINNOACTIVE 最小化窗体,保持其激活状态。
10 SW_SHOWNA 以当前状态显示窗体,保持其激活状态。
11 SW_SHOWNOACTIVATE 以当前的大小和位置显示窗体,并保持其激活状态。
12 SW_SHOWNORMAL 激活并显示一个窗体。如果窗体为最大化或者最小化,窗体恢复到原始的大小和位置。当窗体第一次显示的时候,应用程序记录标记。
如果lpField指定的是一个文档文件,lpParameters应该为null。
lpDirectory
以一个以null结束的字符串指定文件开始运行的默认目录。
nShowCmd
如果lpField指定了一个可执行文件,nShowCmd指定这个文件在被打开时如何显示。这个参数可以是以下值中的任何一个:
如果lpField指定的是文档文件,nShowCmd应该为0。
* return Values(返回值)
如果函数执行成功,返回值是已经运行的工程的实例句柄,或者动态数据交换服务器应用程序的句柄。
(具体返回值列表从略,请参考Delphi在线帮助)
* Remarks(注释)
被lpFile参数指定的文件必须是一个可执行文件或者文档文件。如果文件是一个文档文件,ShellExecute函数将根据lpOperation参数决定打开或者打印这个文件。如果是可执行文件,ShellExecute函数将打开它,即使lpOperation参数被指定为printing。
你可以使用ShellExecute打开活着搜索一个文件夹。可以使用以下任意一种方式打开一个文件夹:
ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);
或者 ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL);
使用下面的调用搜索文件夹:
ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL)
如果lpOperation参数为null,函数将打开由lpFile指定的文件。如果lpOperation参数为”open”或者”explore”,函数将强制打开窗体或者资源管理器。
注:在新窗口打开网页的办法
 ShellExecute(self.Handle, PChar(''open''), PChar(''explorer''), PChar(URL), nil, SW_MAXIMIZE); 
 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","http://bbs.e-0631.cn";,"","",  SW_SHOW);
 Q: 如何激活相关程序,发送EMAIL?
 ShellExecute(this->m_hWnd,"open","mailtnishinapp@yahoo.com","","", 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 ProcessInfo; 
 STARTUPINFO StartupInfo; //入口参数
 ZeroMemory(&StartupInfo, sizeof(StartupInfo));
 StartupInfo.cb = sizeof StartupInfo ; //分配大小
 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);
 }
 else
 {
 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:\"; //也可以是文件
 ShExecInfo.lpParameters = ""; 
 ShExecInfo.lpDirectory = NULL;
 ShExecInfo.nShow = SW_SHOW;
 ShExecInfo.hInstApp = NULL
View Code
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为使用复杂,比较少用。  


WinExec主要运行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);  
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 
首先必须引用shellapi.pas单元:uses ShellAPI;  


1.标准用法  
  ShellExecute函数原型及参数含义如下:  
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;  
  ●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函数的标准用法,下面将介绍它的特殊用法。  


2.特殊用法  
  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。  
  格式一:http://网站域名。  
  如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);  
  格式二:http://网站域名/网页文件名。  
  如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn/default.htm’,nil,nil,       SW_SHOWNORMAL);  
  如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。  
  格式一:mailto:  
  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口。  
  格式二:mailto:用户账号@邮件服务器地址  
  如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)如:ShellExecute(this->m_hWnd,"open",   
             "mailto:nishinapp@yahoo.com","","",      SW_SHOW      );这个可以激活Outlook       Express。  
  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文  
  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。  
例子(delphi):  
在一个应用程序调用c:Project1.exe;  
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串内容’,nil, SW_SHOWNORMAL);  
在Project1.exe里可以调用:  
procedure TForm1.FormCreate(Sender: TObject);  
var i:integer;  
begin  
for i:=1 to paramcount do  
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i));  
end; 


最后的那个参数,为窗口指定可视性方面的一个命令。  
请用下述任何一个常数  
SW_HIDE 隐藏窗口,活动状态给令一个窗口  
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口  
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态  
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态  
SW_SHOWMAXIMIZED 最大化窗口,并将其激活  
SW_SHOWMINIMIZED 最小化窗口,并将其激活  
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口  
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口  
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口  
SW_SHOWNORMAL 与SW_RESTORE相同


深入浅出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",   
              "http://www.google.com","","",       SW_SHOW       );   
      Q:       如何激活相关程序,发送EMAIL?       ShellExecute(this->m_hWnd,"open",   
              "mailto:nishinapp@yahoo.com","","",       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       ProcessInfo;     
      STARTUPINFO       StartupInfo;       //This       is       an       [in]       parameter   
      ZeroMemory(&StartupInfo,       sizeof(StartupInfo));   
      StartupInfo.cb       =       sizeof       StartupInfo       ;       //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);   
      }       
      else   
      {   
              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);   




     附:一些windows的系统命令:


winver---------检查Windows版本 
wmimgmt.msc----打开windows管理体系结构(WMI) 
wupdmgr--------windows更新程序 
wscript--------windows脚本宿主设置 
write----------写字板 
winmsd---------系统信息 
wiaacmgr-------扫描仪和照相机向导 
winchat--------XP自带局域网聊天 


mem.exe--------显示内存使用情况 
Msconfig.exe---系统配置实用程序 
mplayer2-------简易widnows media player 
mspaint--------画图板 
mstsc----------远程桌面连接 
mplayer2-------媒体播放机 
magnify--------放大镜实用程序 
mmc------------打开控制台 
mobsync--------同步命令 


dxdiag---------检查DirectX信息 
drwtsn32------ 系统医生 
devmgmt.msc--- 设备管理器 
dfrg.msc-------磁盘碎片整理程序 
diskmgmt.msc---磁盘管理实用程序 
dcomcnfg-------打开系统组件服务 
ddeshare-------打开DDE共享设置 
dvdplay--------DVD播放器 


net stop messenger-----停止信使服务 
net start messenger----开始信使服务 
notepad--------打开记事本 
nslookup-------网络管理的工具向导 
ntbackup-------系统备份和还原 
narrator-------屏幕“讲述人” 
ntmsmgr.msc----移动存储管理器 
ntmsoprq.msc---移动存储管理员*作请求 
netstat -an----(TC)命令检查接口 


syncapp--------创建一个公文包 
sysedit--------系统配置编辑器 
sigverif-------文件签名验证程序 
sndrec32-------录音机 
shrpubw--------创建共享文件夹 
secpol.msc-----本地安全策略 
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码 
services.msc---本地服务设置 
Sndvol32-------音量控制程序 
sfc.exe--------系统文件检查器 
sfc /scannow---windows文件保护 


tsshutdn-------60秒倒计时关机命令 
tourstart------xp简介(安装完成后出现的漫游xp程序) 
taskmgr--------任务管理器 


eventvwr-------事件查看器 
eudcedit-------造字程序 
explorer-------打开资源管理器 


packager-------对象包装程序 
perfmon.msc----计算机性能监测程序 
progman--------程序管理器 


regedit.exe----注册表 
rsop.msc-------组策略结果集 
regedt32-------注册表编辑器 
rononce -p ----15秒关机 
regsvr32 /u *.dll----停止dll文件运行 
regsvr32 /u zipfldr.dll------取消ZIP支持 


cmd.exe--------CMD命令提示符 
chkdsk.exe-----Chkdsk磁盘检查 
certmgr.msc----证书管理实用程序 
calc-----------启动计算器 
charmap--------启动字符映射表 
cliconfg-------SQL SERVER 客户端网络实用程序 
Clipbrd--------剪贴板查看器 
conf-----------启动netmeeting 
compmgmt.msc---计算机管理 
cleanmgr-------好东西整理 
ciadv.msc------索引服务程序 


osk------------打开屏幕键盘 
odbcad32-------ODBC数据源管理器 
oobe/msoobe /a----检查XP是否激活 
lusrmgr.msc----本机用户和组 
logoff---------注销命令 


iexpress-------木马捆绑工具,系统自带 


Nslookup-------IP地址侦测器 


fsmgmt.msc-----共享文件夹管理器 


utilman--------辅助工具管理器 


gpedit.msc-----组策略 
xp下运行命令大全. 


$Systemroot$Documents and Settingsusername 目录下 


appwiz.cpl------------添加删除程序 


control userpasswords2--------用户帐户设置 


cleanmgr-------垃圾整理 


CMD--------------命令提示符可以当作是 Windows 的一个附件,Ping,Convert 这些不能在图形环境下 使用的功能要借助它来完成。 


cmd------jview察看Java虚拟机版本。 


command.com------调用的则是系统内置的 NTVDM,一个 DOS虚拟机。它完全是一个类似 Virtual PC 的 虚拟环境,和系统本身联系不大。当我们在命令提示符下运行 DOS 程序时,实际上也 是自动转移到 NTVDM虚拟机下,和 CMD 本身没什么关系。 


calc-----------启动计算器 


chkdsk.exe-----Chkdsk磁盘检查 


compmgmt.msc---计算机管理 


conf-----------启动 netmeeting 


control userpasswords2-----User Account 权限设置 


devmgmt.msc--- 设备管理器 


diskmgmt.msc---磁盘管理实用程序 


dfrg.msc-------磁盘碎片整理程序 


drwtsn32------ 系统医生 


dvdplay--------启动Media Player 


dxdiag-----------DirectX Diagnostic Tool 


gpedit.msc-------组策略编辑器 


gpupdate /target:computer /force 强制刷新组策略 


eventvwr.exe-----事件查看器 


explorer-------打开资源管理器 


logoff---------注销命令 


lusrmgr.msc----本机用户和组 


msinfo32---------系统信息 


msconfig---------系统配置实用程序 


net start (servicename)----启动该服务 


net stop (servicename)-----停止该服务 


notepad--------打开记事本 


nusrmgr.cpl-------同control userpasswords,打开用户帐户控制面板 


Nslookup-------IP地址侦测器 


oobe/msoobe /a----检查XP是否激活 


perfmon.msc----计算机性能监测程序 


progman--------程序管理器 


regedit----------注册表编辑器 


regedt32-------注册表编辑器 


regsvr32 /u *.dll----停止dll文件运行 


route print------查看路由表 


rononce -p ----15秒关机 


rsop.msc-------组策略结果集 


rundll32.exe rundll32.exe %Systemroot%System32shimgvw.dll,ImageView_Fullscreen----启动一个空白的Windows 图片和传真查看器 


secpol.msc--------本地安全策略 


services.msc---本地服务设置 


sfc /scannow-----启动系统文件检查器 


sndrec32-------录音机 


taskmgr-----任务管理器(适用于2000/xp/2003) 


tsshutdn-------60秒倒计时关机命令 


winchat--------XP自带局域网聊天 


winmsd---------系统信息 


winver-----显示About Windows 窗口


Windows XP的关机是由Shutdown.exe程序来控制的,位于Windows\System32文件夹中。如果想让Windows 2000也实现同样的效果,可以把Shutdown.exe复制到系统目录下。 


比如你的电脑要在22:00关机,可以选择“开始→运行”,输入“at 22:00 Shutdown -s”, 这样,到了22点电脑就会出现“系统关机”对话框,默认有30秒钟的倒计时并提示你保存工作。如果你想以倒计时的方式关机,可以输入“Shutdown.exe -s -t 3600”,这里表示60 分钟后自动关机,“3600”代表60分钟。 


设置好自动关机后,如果想取消的话,可以在运行中输入“shutdown -a”。另外输入“shutdown -i”,则可以打开设置自动关机对话框,对自动关机进行设置。 


Shutdown.exe的参数,每个都具有特定的用途,执行每一个都会产生不同的效果,比如 “-s”就表示关闭本地计算机,“-a”表示取消关机操作,下面列出了更多参数, 可以在Shutdown.exe中按需使用。 


-f:强行关闭应用程序 


-m \\计算机名:控制远程计算机 


-i:显示图形用户界面,但必须是Shutdown的第一个选项 


-l:注销当前用户 


-r:关机并重启 


-t 时间:设置关机倒计时 


-c "消息内容":输入关机对话框中的消息内容(不能超127个字符) 


有时候,我们需要定时关闭计算机,下面介绍一个在Windows XP下实现定时关机的简单方法。 


指定系统在22分钟后自动关闭:点击“开始→运行”,在“打开”中输入命令“Shutdown -s -t 1320”(注意:引号不输入,参数之间有空格,1320的单位是秒),单击“确定” 
按钮即可。 


指定系统在某个时间(比如12:00)自动关闭:在“打开”中输入命令 
“at 1200 Shutdown -s”即可。 


取消定时关机:在“打开”中输入命令“Shutdown -a”即可。
View Code

关闭外部获得到外部exe文件进程句柄

ShellExecute问题   
大家知道,在一个大型复杂的系统中,有时会调用一些外部程序来帮助我们完成某些特定功能。然而,如何打开并关闭这些外部程序呢?也许,这是一个老生常谈的话题,但笔者仍要继续讨论这个问题,原因有二:一是解决这个问题的方法很重要,并经常会遇到;二是大多数参考书提及的解决办法不全面,仍有很多朋友有疑问。下面,我将详细地阐述这个问题(提供的源代码均在WinNT/Delphi4.0环境下运行通过)。 

一、如何打开一个外部程序:
我们常用的函数有两个,WinExec,ShellExecute,因为ShellExecute函数主要用于Win32下,功能也强大一些,故而本文只对后者进行讨论。

首先,我们粗略地研究一下ShellExecute的几个参数:
hwnd:窗体的句柄; 
lpOperation:打开程序执行的操作,共预留有"open","explore","print"三种方式,此参数可以省略,此时将依据打开的文件(lpFile)的类型执行相应的操作,比如:如果lpFile为一文本文件,那么将会在与该文件相关联的程序中打开它; 
lpFile:文件名; 
lpParamerters:打开文件时所需的参数; 
lpDirectory:文件名所在的路径,当然,一般来说,在Windows中登 
记过的程序(如WinWord)不必提供此参数; 
nShowCmd:打开文件后程序窗体如何显示。 
该函数的详细文档请读者朋友参阅相应帮助。

其次,我们来举一个例子(以"记事本"为例): 
procedure TForm1.OpenBtnClick(Sender:TObject); 
begin 
ShellExecute(handle,''open'',''notepad.exe'',nil,nil,SW_ShowNormal); 
end; 
读者朋友可以在你的Delphi环境下试试这段代码,当然,由于使用Windows的API函数,请加上ShellAPI单元。

获得到外部exe文件进程句柄
二、如何关闭打开的外部程序: 
要关闭一个外部程序,只需向他发送一条消息就行了,比如,SendMessage(ExeHandle,WM_Close,0,0);其中ExeHandle是程序窗体的句柄,但如何得到窗体句柄呢?这是最为关键的地方,幸好Windows提供了FindWindow()函数,它能够解决这个问题,它有两个参数:lpClassName:程序的类名;lpWindowName:程序窗体的标题。

第一种情况也是最简单情况的就是提供确定的[*"确定的"加着重号*] 
"lpWindowName"参数,如下例: 
procedure TForm1.CloseAppClick(Sender: TObject);//确定标题 
var
Exehandle:Thandle; 
begin
//获得句柄-->标题确定 
ExeHandle:=findWindow(nil,''文件管理器'');//返回句柄 
//关闭程序
if ExeHandle<>0 then 
SendMessage(ExeHandle,WM_Close,0,0) 
Else 
Application.MessageBox(''没有打开"文件管理器"!'',''提示'', 
MB_IconInformation+MB_OK); 
end; 

另一种情况是程序窗体没有确定的[*"没有确定的"加着重号*]标题,这就是很多朋友出现疑问的地方,也是几乎所有参考书均不涉及的地方。比如打开"写字板"程序,它的标题会随着文本文件名的不同而不同,此时,你要关闭它,就不得不提供程序的类名,但是如何获得程序的类名呢?笔者在这里向大家介绍一个可行的办法:首先打开程序(此处以"记事本"为例),然后,运行WinSight32(Delphi自带程序)或Spy++(VC自带程序[菜单:监视-查找窗口]),找到程序( "记事本")的运行状态,即可找到我们需要的类名(两者均为"Class Name"项)。参考一个例子: 
procedure TForm1.CloseVAppClick(Sender: TObject);//标题不确定 
var 
var 
ExeHandle:Thandle; 
Begin 
//获得句柄-->标题不确定 
ExeHandle:=FindWindow(''notepad'',nil);//'''');//返回句柄 
//关闭程序 
if ExeHandle<>0 then 
SendMessage(ExeHandle,WM_Close,0,0) 
Else 
Application.MessageBox(''没有打开"记事本"程序!'',''提示'', 
MB_IconInformation+MB_OK); 
end; 

当然,既能提供程序的类名又能提供程序窗体的标题自然就没有讨论的必要了。这样,我们就可以在自己的程序中打开并关闭任意的外部程序了。另外,笔者在这里罗嗦一句:上文提到的ShellExeCute()还有有相当"豪华" 的用处!细心的读者可能注意到有的作者的程序里提供了一些广告他们的连接,这其实就是ShellExeCute()的运用之一,略举一例: 
procedure TForm1.HttpClick(Sender: TObject); 
begin 
ShellExecute(handle,''open'',''http://liangming.163.net'', 
nil,nil,SW_ShowNormal); 
end;
View Code

 

Artifact tlks: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.Execut...

Artifact tlks: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.Execut...

传送门:https://www.cnblogs.com/eatkid/p/8064763.html

intellij idea tomcat 启动不生成war包

 

intellij idea tomcat 启动不生成war包

想把项目打包成war包做测试,但是按照之前的方法居然没有成功导出war包,犯了很低级的错误,特此记录。

(1)首先在Project Structure 界面,修改type为 Web Application:Archive。

(2)点击运行tomcat,war包就会乖乖的在指定的output文件夹下生成。

然而并没有,tomcat报错信息如下:

[2017-12-19 11:42:28,796] Artifact tlks: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException: E:\IDEAspace\tlksArtfacts\tlks.war not found for the web module.

原因排查:

首先想到的是重新编译。疯狂点击tomcat小图标左侧的编译按钮,无果。

然后想的是设置IDEA的Artfacts有问题,移除了现有了然后重新添加,无果。

最后在tomcat的一个很隐蔽的地方找到了问题,如图:

点击OK后启动tomcat,就可以在 output文件夹下找到自己导出的war包了。

如此,就解决了war not found for the web module.的问题

azkaban Execute Flow选项卡里 FailureOptions Finish All Possible的具体使用

azkaban Execute Flow选项卡里 FailureOptions Finish All Possible的具体使用

请问Execute Flow选项卡里 Failure Options

Finish All Possible的具体使用。

我设置了Finish All Possible,可是当前一个job失败了,后一个还是不会执行啊?

我现在有个C.job,依赖了A.job和B.job ,不管AB中的哪个失败,都会执行C.job,要怎么配置?

c# – ProcessStartInfo.UseShellExecute = true并等待进程退出

c# – ProcessStartInfo.UseShellExecute = true并等待进程退出

我想使用 shell可执行文件来尊重启动应用程序的用户首选项,但我还需要知道该特定应用程序何时关闭.

Process editProcess = new Process();
processstartinfo startInfo = new processstartinfo();
startInfo.FileName = filename;
startInfo.Verb = "edit";
startInfo.UseShellExecute = true;
editProcess.StartInfo = startInfo;

// start the default editor
editProcess.Start();
editProcess.WaitForExit();

WaitForExit似乎在shell进程退出时返回,而不是在真正的进程退出时返回.

有没有更好的方法知道何时启动应用程序退出而不是手动解析注册表,找到正确的应用程序启动并显式启动该应用程序而不执行shell?

解决方法

处理流程退出事件:

editProcess.Exited += process_Exited;

今天关于against parallel execution in shell (flock)的分享就到这里,希望大家有所收获,若想了解更多关于API函数ShellExecute与ShellExecuteEx用法、Artifact tlks: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.Execut...、azkaban Execute Flow选项卡里 FailureOptions Finish All Possible的具体使用、c# – ProcessStartInfo.UseShellExecute = true并等待进程退出等相关知识,可以在本站进行查询。

本文标签: