三個SDK函數:?
WinExec,ShellExecute? ,CreateProcess可以實現調用其他程序的要求,其中以WinExec最為簡單,ShellExecute比WinExec靈活一些,CreateProcess最為復雜。
? ? ? ? WinExec? 兩個參數,前一個指定路徑,后一個指定顯示方式。
? ? ? ? ShellExecute? 可以指定工作目錄,并且還可以尋找文件的關聯直接打開不用加載與文件關聯的應用程序,ShellExecute還可以打開網頁,啟動相應的郵件關聯發送郵件等等。
? ? ? ? CreateProcess? 一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承信息,類的優先級等等。如果我們要得到足夠多的關于新的進程的信息,控制新的進程的細節屬性,若要達到這些目的,我們就需要使用CreateProcess函數了。
?
三個SDK函數(? WinExec、ShellExec、CrateProcess? )的語法:
?
WinExec
這個函數最簡單,只有兩個參數,原型如下:
?
? ? ? ? ? ? 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? 等等,就不會出現正常的? 窗體,但是已經被加到任務列表里了。
?
ShellExecute
原型如下:
? ? ? ? ? ? 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
原型如下:
? ? ? ? ? ? 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);
?
可以看出,通過上面的幾個不同的方法,都可以實現在應用程序中打開其他應用程序的目的,其中有些方法可能會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的!
?
?
關于三個SDK函數:? WinExec,? ShellExecute,CreateProcess? 的其他注意事項:
1、定義頭文件
在頭文件stdafx.h中必須定義以下兩個頭文件:
#include? <shlobj.h>? //? 可替換為? windows.h
#include? <shellapi.h>
如果定義了頭文件? #include? <windows.h>的話就不必定義? #include? <shlobj.h>了,"windows.h"? 不光是包含了"shellapi.h",它還定義了許多數據類型,如果沒有這些數據類型,shellapi.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);
?
?
?
?
三個SDK函數(?
?
WinExec
這個函數最簡單,只有兩個參數,原型如下:
?
?
?
?
?
使用方法如下:
WinExec("Notepad.exe",?
WinExec("D:\\Program?
需要注意的是若用?
?
ShellExecute
原型如下:
?
?
?
?
?
?
?
);
使用方法如下:
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);?
ShellExecute(NULL,?
ShellExecute(NULL,"explore",?
ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL,?
ShellExecute不支持定向輸出。
?
CreateProcess
原型如下:
?
?
?
?
?
?
?
?
?
?
?
?
?
使用方法如下:
?
?
?
?
?
?
?
?
可以看出,通過上面的幾個不同的方法,都可以實現在應用程序中打開其他應用程序的目的,其中有些方法可能會麻煩一點,所以就需要我們根據不同的目的去選擇最適合自己的方法去實現自己的目的!
?
?
關于三個SDK函數:?
1、定義頭文件
在頭文件stdafx.h中必須定義以下兩個頭文件:
#include?
#include?
如果定義了頭文件?
?
2、定義路徑
C++中所表示的路徑要用?
Disk:\\Directory\\...\\File?
WinExec("D:\\Program?
ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);
bool?