原文出處:http://blog.csdn.net/b_h_l/article/details/7717744
三個SDK函數: WinExec,ShellExecute
,CreateProcess可以實現調用其他程序的要求,其中以WinExec最爲簡單,ShellExecute比WinExec靈活一些,CreateProcess最爲複雜。
(一)WinExec
需要的頭文件:windows.h,winbase.h(前者是試驗出來,後者是msdn上說明),另外,這兩者的先後順序不能變。
這個函數最簡單,只有兩個參數,原型如下:
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 等等,就不會出現正常的 窗體,但是已經被加到任務列表裏了。
這個函數只能打開exe文件。
(二)ShellExecute
需要的頭文件:windows.h,shellapi.h(前者是我試驗出來的,後者是msdn說需要的,這裏發現後面的頭文件不加也無妨,不管)。另外這兩者的先後順序不能變。
原型如下:
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
需要的頭文件:windows.h,winbase.h(前者是試驗出來,後者是msdn上說明),另外,這兩者的先後順序不能變。
原型如下:
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);
這個函數可以打開任意文件,會調用系統註冊的程序來打開對應後綴名的文件。
PS:
1、定義頭文件
原作者的內容刪去。
這個是引用新函數都必須注意的內容。但是MS的頭文件引用順序有點怪,比如上面的三種清理。另外,如果用了預編譯,那麼記得在任何源程序中的#include "stdafx.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) ;
一般來說還是建議直接用絕對路徑解決以防出現不必要的問題。