Shellapi 的特色,就是先定义一个结构体,然后就调用一个函数,而这个函数的参数通常就是这个结构体的指针,比如本例中的 SHELLEXECUTEINFO 结构体。
void CProcessDlg ::OnBnClickedButtonShell ()
{
// TODO: 在此添加控件通知处理程序代码
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo .cbSize = sizeof (SHELLEXECUTEINFO );
ShExecInfo .fMask = SEE_MASK_NOCLOSEPROCESS ;
ShExecInfo .hwnd = NULL ;
ShExecInfo .lpVerb = NULL ;
ShExecInfo .lpFile = _T ("C://Program Files//Internet Explorer//iexplore.exe" );
ShExecInfo .lpParameters = _T ("www.google.com.hk" );
ShExecInfo .lpDirectory = NULL ;
ShExecInfo .nShow = SW_SHOW ;
ShExecInfo .hInstApp = NULL ;
ShellExecuteEx (&ShExecInfo );
}
可能初学者认为CreateProcee 函数会有点复杂,其实也就是一个路径,一个启动参数,还有两个结构体。
void CProcessDlg ::OnBnClickedButtonCreate ()
{
// TODO: 在此添加控件通知处理程序代码
STARTUPINFO si ;
ZeroMemory (&si ,sizeof (si ));
si .cb = sizeof (si );
PROCESS_INFORMATION pi ;
ZeroMemory (&pi ,sizeof (pi ));
LPCTSTR lpPath = _T ("C://Program Files//Internet Explorer//iexplore.exe" );
LPTSTR lpCmdline = _T (" http://www.google.com.hk" );// 网址前面加个空格
CreateProcess (lpPath ,lpCmdline ,NULL ,NULL ,FALSE ,0,NULL ,NULL ,&si ,&pi );
}
WinExec 函数应该只支持多字节,所以Unicode 下面会有问题的。
void CProcessDlg ::OnBnClickedButtonWinexec ()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szPath [MAX_PATH ] = _T ("C://Program Files//Internet Explorer//iexplore.exe" );
TCHAR szCmdline [] = _T (" http://www.google.com.hk" );
_tcscat_s (szPath ,MAX_PATH ,szCmdline );
WinExec (szPath ,SW_NORMAL );
}