Win32 API程式設計:使用CreateProcess建立新程序
在呼叫CreatePricess的前兩個引數:pszApplicationName和pszCommandLine時可能崩潰的問題: pszApplicationName和pszCommandLine引數分別指定新程序要使用的執行體檔案的名稱,以及要傳給新程序的命令列字串。先來談談pszCommandLine引數。 注意,pszCommandLine引數被原型化為一個PTSTR。這意味著CreateProces期望你傳入的是一個非“常量字串”的地址。在內部,CreateProcess實際上會修改你傳給它的命令列字串。但在CreateProcess返回之前,它會將這個字串還原為原來的形式。 這是很重要的,因為如果命令列字串包含在你的檔案映像的只讀部分,就會引起訪問衝突(違例)。例如,以下程式碼就會導致衝突,因為Microsoft的C/C++編譯器把"NOTEPAD"字串放在只讀記憶體中:
CreateProcess試圖修改字串時,會引起一個訪問衝突(Microsoft C/C++編譯器的早期版本把字串放在可讀/寫記憶體中。所以對CreateProcess函式的呼叫不會引起訪問衝突)。 解決這個問題的最佳方式是:在呼叫CreateProcess之前,把常量字串複製到一個臨時緩衝區,如下所示:
涉及的字元關係: char* 替換: LPSTRconst char* 替換: LPCSTRWCHAR* 替換: LPWSTRconst WCHAR* 替換: LPCWSTR (C在W之前, 因為 const 在 WCHAR之前)TCHAR* 替換: LPTSTRconst TCHAR* 替換: LPCTSTR |
在呼叫CreatePricess的前兩個引數:pszApplicationName和pszCommandLine時可能崩潰的問題:
pszApplicationName和pszCommandLine引數分別指定新程序要使用的執行體檔案的名稱,以及要傳給新程序的命令列字串。先來談談pszCommandLine引數。 注意,pszCommandLine引數被原型化為一個PTSTR。這意味著CreateProces期望你傳入的是一個非“常量字串”的地址。在內部,CreateProcess實際上會修改你傳給它的命令列字串。但在CreateProcess返回之前,它會將這個字串還原為原來的形式。 這是很重要的,因為如果命令列字串包含在你的檔案映像的只讀部分,就會引起訪問衝突(違例)。例如,以下程式碼就會導致衝突,因為Microsoft的C/C++編譯器把"NOTEPAD"字串放在只讀記憶體中:
1 2 3 4 |
|
CreateProcess試圖修改字串時,會引起一個訪問衝突(Microsoft C/C++編譯器的早期版本把字串放在可讀/寫記憶體中。所以對CreateProcess函式的呼叫不會引起訪問衝突)。
解決這個問題的最佳方式是:在呼叫CreateProcess之前,把常量字串複製到一個臨時緩衝區,如下所示:
1 2 3 |
|
涉及的字元關係:
char* 替換: LPSTRconst char* 替換: LPCSTRWCHAR* 替換: LPWSTRconst WCHAR* 替換: LPCWSTR (C在W之前, 因為 const 在 WCHAR之前)TCHAR* 替換: LPTSTRconst TCHAR* 替換: LPCTSTR
關閉 TerminateProcess(pi.hProcess,0);