獲得目前的目錄:
DWORD GetFullPathName(PCTSTR pszFile,DWORD cchPath,PTSTR pszPath,PTSTR *ppszFilePart);
擷取C盤的目前的目錄
TCHAR szCurDir[MAX_PATH];
GetFullPathName("C",MAX_PATH,szCurDir,NULL);
獲得系統版本:
BOOL GetVersion(POSVERSIONINFO pVersionInformation);
建立進程函數:
BOOL CreateProcess
{
PCTSTR pszApplicationName;//新進程使用的可執行檔的名字
PTSTR pszCommandLine;//傳遞給新進程的命令列字串
PSECURITY_ATTRIBUTES psaProcess;//建立進程的安全屬性,一般預設為NULL
PSECURITY_ATTRIBUTES psaThread; //建立線程的安全屬性,一般預設為NULL
BOOL bInteritHandle;//是否可繼承
DWORD fdwCreate;//如何來建立進程
PVOID pvEnvironment;//用於指向包含新進程將要使用的環境字串的記憶體塊
PCTSTR pszCurDir;//父進程設定目錄,NULL為預設程式啟動並執行目錄
PSTARTUPINFO psiStartInfo;//指向STARTUPINFO結構,堆棧,最好要先
STARTUPINFO si={sizeof(si)};
GetStartupInfo(&si);(初始化)否則會把無用資訊傳遞給CreateProcess,產生不確定因素
PPROCESS_INFOMATION ppiProcInfo//PROCESS_INFORMATION結構,裡面記錄該進程的所擁有的線程ID和子進程ID
};
成功返回TRUE //注意,如果建立進程找不到相關的DLL也會返回TRUE;
pszCommandLine最好不要傳入常量,VC會把傳入的字串放入唯讀記憶體,例如:
CreateProcess(NULL,_T("NOTEPAD"),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
將會運行錯誤(經過自己測試,GCC不會運行錯誤,VS2005會,書上說早期的VC也不會錯誤)
最好是:
TCHAR szCommandLine[]=_T("NOTEPAD");
CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
將會開啟NOTEPAD程式
TCHAR szPath[]="WORDPAD README.TXT";
CreateProcess("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE",szPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
開啟NOTEPAD程式,並傳入szpaht的命令
fdwCreate 用於規定如何來建立新進程,也可以設定優先順序.
EBUG_PROCESS:當子進程發生某些事情,要告訴父進程
DEBUG_ONLY_THIS_PROCESS:和EBUG_PROCESS類似,不過只告訴發生的某些特定時間,比如子進程再建立子進程就不告訴
CREATE_SUSPENDED:子進程建立,父進程掛起
DETACHED_PROCESS:組織基於GUI進程對他的父進程console的訪問,並將輸出發送到新的console視窗
CREATE_NEW_CONSOLE:建立新進程同時為新進程建立控制台,不可和DETA_PROCESS同時使用,否則產生一個錯誤
CREATE_NO_WINDOW:不要為新進程建立控制台視窗
CREATE_NEW_PROCESS_GROUP:當建立多個進程後,如果使用者按下CTRL+C,那麼將會同時告訴所有進程使用者按下CTRL+C;
CREATE_DEFAULT_ERROR_MODE:新進程不繼承父進程的錯誤使用模式
CREATE_SEPARATE_WOW_VDM:當在WINDOWS 2000運行16位的時候,建立單獨的DOS虛擬機器
CREATE_SHARED_WOW_VDM:當在windows 2000運行16位的時候,除非設定CREATE_SHPARATE_WOW_VDM,否則所有16位程式都在單獨的DOS虛擬機器運行,但是可以改變註冊表共用
CREATE_FORCEDOS:強制系統運行嵌入16位OS/2應用程式的MOS-DOS應用程式
CREATE_BREAKAWAY_FROM_JOB:使用作業中的金衡產生一個與作業相關聯的新進程
終止運行進程:
1.主線程函數返回(最好的方法)
2.進程中的線程調用ExitProcess(最好不要);
3.另外一個進程中的線程(最好也不要);
4.所有線程自行終止
BOOL TerminateProcess(HANDLE hProcess,UINT fuExitCode);
與EixtProcess差別:任何線程都可以調用TerminateProcess
獲得目前已經撤銷進程的結束代碼
BOOL GetExitCodeProcess(HANDLE hProcess,PDWORD pdwExitCode);
CloseHandle(HANDLE hProcess);關閉不用的控制代碼,很重要
DWORD WaitForSingleObject(HANDLE hObject,DWORD dwTimeout);
等待hObject終止運行
PVOID GetModulePreferredBaseAddr(DWORD dwProcessID,PVOID pvModuleRemote);
接受一個進程ID和進程模組的地址