MSDN 範例代碼在 Unicode 編譯模式下(專案屬性 → 字元集 = Unicode)編譯通過但執行崩潰,警告:
warning C4133: 'function' : incompatible types - from 'char [9]' to 'LPWSTR'
CreateProcess 在 Unicode 模式下映射為 CreateProcessW。lpCommandLine 型別為 LPWSTR(可修改的寬字串指標)。"calc.exe" 型別為 const char[9],隱式轉換為 LPWSTR 截斷/誤解位模式,導致運行時存取違規。TCHAR cmd[] = _T("calc.exe"); // TCHAR = wchar_t (Unicode) 或 char (MBCS)
CreateProcess(NULL, cmd, ...); // cmd 可修改,型別匹配 LPWSTR/LPTSTR
CreateProcessA(NULL, "calc.exe", ...); // 強制 ANSI,無視專案字元集
CreateProcessW(NULL, L"calc.exe", ...); // L 前綴 = wchar_t[]
error C2664: 'CreateProcessW' : cannot convert parameter 2 from 'const char [9]' to 'LPWSTR'
C++ 直接報錯阻止編譯,C 僅警告,故 C 專案更易踩坑。
_T() 或 TEXT()。lpCommandLine、GetWindowsDirectory),必須定義 TCHAR buf[] 複製內容,不可直接傳字面值。std::wstring/std::string 並在呼叫時 .c_str(),型別由編譯器檢查。LPTSTR = 輸出/可修改,LPCTSTR = 輸入/只讀。Windows TCHAR 模型是雙刃劍:簡化了雙版本維護,但若不理解字串字面值型別與 API 參數修飾符的對應關係,極易在 C 專案中引入隱性 Bug。