• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            aurain
            技術文摘
            posts - 137,  comments - 268,  trackbacks - 0

            5.進程:

            1)在Win32系統中每一個進程都擁有4GB的地址空間。Win32進程什么也不執行,它只是擁有4GB的地址空間來存放應用程序EXE文件所需要的代碼和數據。除地址空間外,進程還擁有文件、動態內存、線程等資源。由線程負責執行包含在進程地址空間里的代碼。每一個線程有它自己的CPU寄存器組和自己的棧。每一個進程至少有一個線程來執行包含在地址空間中的代碼。如果地址空間中沒有線程在執行代碼,那么系統就會釋放進程和它的地址空間。


            (2)加載器:Win32支持兩類應用程序,控制臺應用程序CUI和圖形用戶界面應用程序GUIExe文件中的一個子系統值指出這個應用程序是控制臺應用程序還是圖形用戶界面應用程序。

            (3)VC編寫的Win32控制臺應用程序都有一個main函數,而圖形界面應用程序都有一個WinMain函數。

            (4)C/C++的啟動函數:_WinMainCRTStartup函數。它負責執行:

            1.得到一個新進程的全部命令行指針。

            2.得到一個新進程的環境變量指針。

            3.通過包含Stdlib.h來初始化能被應用程序訪問的C運行時全局變量。

            4.初始化由C運行時內存分配函數使用的堆和其它的低級輸入輸出例程。

            5調用WinMain函數。

            6.WinMain返回后,啟動代碼調用C運行時的exit函數,傳給它WinMain的返回值。Exit函數執行一些清理工作,然后調用Win32ExitProcess函數,傳給它WinMain函數的返回值。

            (5)實例句柄:每一個加載到進程地址空間的ExeDLL文件都有一個唯一的實例句柄。WinMain的第一個參數hinstExeExe文件的實例。在加載資源時所使用的函數要使用這個實例句柄。

            (6)基本內存地址:WinMain的參數hinstExe的實際值就是一個基本內存地址。它指出系統是在什么地方把EXE文件的映象裝入進程的地址空間的。基本內存地址由鏈接器決定。

            (7)HANDLE GetModuleHandle(LPCTSTR lpszModule)函數:返回的句柄是EXEDLL文件在地址空間里的基本地址。參數是ExeDLL文件的名字。該函數的兩個需要注意的地方:一、該函數只查看調用進程的地址空間。二、參數為NULL時返回的是EXE文件的基本內存地址。

            (8)Win32hinstExehmodExe是一個值。WinMain的參數hinstExePrev對于Win32無意義,它的值總為NULL。在Win32下,應用程序的每一個實例都必須注冊它自己窗口類,這是因為窗口類不能被同一應用程序中的所有實例共享。只有hinstExePrev值為NULL時,在Win32下應用程序的每一個實例才會注冊它自己的窗口類。

            (9)進程的環境變量函數:BOOL SetEnviromentVariable(LPCTSTR lpszName,LPCTSTR lpszValue);該函數把由lpszName標識的值設置為由lpszValue標識的值。如果指定的變量名已經存在,就修改它的值。如果不存在,就增加該變量。如果lpszValue的值為NULL,變量就被從環境變量中刪除。

            (10)進程的命令行

            (11)進程的錯誤模式:當進程出現錯誤時, 它用來告訴系統應當以何種模式去處理該錯誤。使用的函數是:UINT SetErrorMode(UINT fuErrorMode);其中參數fuErrorMode是以下四個值的任意組合,它們是:SEM_FAILCRITICALERRORS(系統不顯示嚴重錯誤處理消息框,把錯誤返回調用的進程)SEM_NOGPFAULTERRORBOX(系統不顯示普通保護錯誤消息框。該標識只能被調試應用程序設置來用異常句柄自己處理普通保護錯誤GP)SEM_NOOPENFILEERRORBOX(系統在找不到文件時不顯示消息框)SEM_NOALIGNMENTFAULTEXCEPT(系統自動修復內在排列錯誤,使它們對應用不可見。該標識對x86Alpha處理器無用)

            注:缺省情況下子進程會繼承父進程的錯誤模式。但是父進程可以通過在調用CreateProcess時設置CREATE_DEFAULT_ERROR_MODE標識來防止子進程繼承。

             

            (12)進程的當前驅動器和目錄:可以使用下列函數來得到和設置進程的當前驅動器和目錄:DWORD GetCurrentDirectory(DWORD cchCurDir,LPCTSTR lpszCurDir);

            BOOL SetCurrentDirectory(LPCTSTR lpszCurDir);

            (13)系統版本號:一般使用 BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation);來得到系統版本號,其中參數lpVersionInformation是一個LPOSVERSIONINFO結構,該結構的定義如下:

            typedef struct{

            DWORD dwOSVersionInfoSize;//在調用GetVersionEx函數前必須被設置為:SizeOf(OSVERSIONINFO);

            DWORD dwMajorVersion;//系統主版本號

            DWORD dwMinorVersion;//系統次版本號

            DWORD dwBuildNumber;

            DWORD dwPlatformID;//標識當前系統支持的平臺

            TCHAR szCSDVersion[128];

            }OSVERSIONINFO,*LPOSVERSIONINFO;

            (14)CreateProcess函數:應用程序調用CreateProcess函數來創建一個進程。

            BOOL CreateProcess(

            LPCTSTR lpszApplicationName,

            LPCTSTR lpszCommandLine,

            LPSECURITY_ATTRIBUTES lpsaProcess,

            LPSECURITY_ATTRIBUTES lpsaThread,

            BOOL fInheritHandles,

            DWORD fdwCreate,

            LPVOID lpvEnvironment,

            LPTSTR lpszCurDir,

            LPSTARTUPINFO lpsiStartInfo,

            LPPROCESS_INFORMATION lppiProcInfo

            );

            當應用程序中某個線程調用這個函數時,系統創建了一個引用計數為1的進程內核對象。該內核對象不是進程,而是操作系統用來管理進程的一小塊數據結構。系統然后為新進程創建一個4GB的虛擬地址空間,把可執行文件和DLL及數據都裝入該地址空間。系統之后為新進程的主線程創建一個使用計數為1的線程內核對象,之后主線程開始執行C運行時的啟動代碼,最終會調用WinMain函數。如果系統成功地創建了新進程和主線程,CreateProcess函數返回True

            各個參數說明:

            lpszCommandLine:該參數可以用來指定CreateProcess用來創建新進程的完整命令行,這個命令行里可以包含“可執行文件名”(如果這個可執行文件沒有指定擴展名的話,系統會認為其擴展名為exe)注:可以包含可執行文件名+這個可執行文件的完整路徑,如果未指定完整路徑,那么CreateProcess會以下面的順序查找可執行文件:1.含有調用進程的Exe文件目錄2調用進程的當前目錄3 Windows系統目錄4Windows目錄5列在PATH環境變量中的目錄。如果系統找到了可執行文件,就創建一個進程,把可執行文件的代碼和DLL及數據裝入新進程的地址空間。系統然后調用C運行時的啟動例程。之后C運行時的啟動例程會查看進程的命令行,把可執行文件名后的第一個參數地址傳遞為WinMainlpszCmdLine參數。上面講述的情況是在參數lpszApplicationNameNULL時。

            lpszApplicationName:可執行文件的名稱及其擴展名。如果不指定擴展名那么系統將不會認為其擴展名為exe。如果不指定可執行文件的路徑,那么CreateProcess只在當前目錄下查找可執行文件,如果找不到它將返回失敗。

            下面列舉一例說明上面講的兩個參數,CreateProcess(“C:WINNTSYSTEM32NOTEPAD.EXE”,”WORDPAD README.TXT”…..);

            系統將啟動NotePad,但是NotePad的命令行是WORDPAD README.TXT這樣寫主要是為了支持Windows NTPOSIX子系統。

            posted on 2010-05-21 14:23 閱讀(833) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發

            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(17)

            隨筆分類(138)

            隨筆檔案(137)

            網絡開發

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 497550
            • 排名 - 36

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲欧美日韩中文久久| 国产精品女同久久久久电影院| 精品久久久久久无码中文字幕 | 久久国产午夜精品一区二区三区| 久久99这里只有精品国产| 久久久久久久人妻无码中文字幕爆| 亚洲成色WWW久久网站| 99久久99久久精品国产片果冻| 久久777国产线看观看精品| 国产69精品久久久久久人妻精品| 91精品国产综合久久婷婷| 国产69精品久久久久9999APGF | 欧洲人妻丰满av无码久久不卡| 国产成人精品久久亚洲高清不卡| 久久99精品久久久久久久不卡| 久久久亚洲精品蜜桃臀| 人妻无码精品久久亚瑟影视| 午夜精品久久久内射近拍高清| 日产精品久久久久久久| 人人狠狠综合久久亚洲高清| 精品久久久久久综合日本| 欧美精品乱码99久久蜜桃| 久久精品国产99久久久香蕉| 久久亚洲国产欧洲精品一| 日韩精品久久久久久| 久久婷婷国产剧情内射白浆| 久久精品亚洲日本波多野结衣| 久久人人爽人人爽人人片AV麻烦| 青青青青久久精品国产h久久精品五福影院1421 | 久久99国产精品久久99果冻传媒| 亚洲国产精品无码久久久秋霞2 | 日产久久强奸免费的看| 久久久久亚洲AV成人网人人软件 | 久久亚洲国产午夜精品理论片| 国产综合久久久久久鬼色| 久久精品国产亚洲av麻豆色欲| 久久综合给久久狠狠97色| 精品熟女少妇av免费久久| 精品精品国产自在久久高清| 国产精品日韩深夜福利久久| 人妻少妇精品久久|