windows核心編程 第四章 進程

來源:互聯網
上載者:User

獲得目前的目錄:
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和進程模組的地址

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.