天天看點

日常工作問題總結(三十二)shellExecute、shellExecuteEx、WinExec、CreateProcess的差別

         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 實作的基礎。

繼續閱讀