首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 Unicode 陷阱:CreateProcess 與 TCHAR 模型衝突

     編輯:關於C語言

問題現象

MSDN 範例代碼在 Unicode 編譯模式下(專案屬性 → 字元集 = Unicode)編譯通過但執行崩潰,警告:

warning C4133: 'function' : incompatible types - from 'char [9]' to 'LPWSTR'

根本原因

  • CreateProcess 在 Unicode 模式下映射為 CreateProcessW。
  • 第二參數 lpCommandLine 型別為 LPWSTR(可修改的寬字串指標)。
  • 字串常數 "calc.exe" 型別為 const char[9],隱式轉換為 LPWSTR 截斷/誤解位模式,導致運行時存取違規。

正確寫法(三種)

1. 使用 _T/TEXT 宏 + 可修改緩衝區

TCHAR cmd[] = _T("calc.exe");  // TCHAR = wchar_t (Unicode) 或 char (MBCS)
CreateProcess(NULL, cmd, ...); // cmd 可修改,型別匹配 LPWSTR/LPTSTR

2. 顯式呼叫 A 版本(ANSI)

CreateProcessA(NULL, "calc.exe", ...); // 強制 ANSI,無視專案字元集

3. 顯式呼叫 W 版本 + 寬字串字面值

CreateProcessW(NULL, L"calc.exe", ...); // L 前綴 = wchar_t[]

C++ 編譯器更嚴格

error C2664: 'CreateProcessW' : cannot convert parameter 2 from 'const char [9]' to 'LPWSTR'

C++ 直接報錯阻止編譯,C 僅警告,故 C 專案更易踩坑。

最佳實踐

  1. 新專案預設 Unicode,所有字串字面值加 _T() 或 TEXT()。
  2. API 參數需可修改緩衝區時(如 lpCommandLine、GetWindowsDirectory),必須定義 TCHAR buf[] 複製內容,不可直接傳字面值。
  3. 使用 std::wstring/std::string 並在呼叫時 .c_str(),型別由編譯器檢查。
  4. 閱讀 MSDN 文件時注意參數標註:LPTSTR = 輸出/可修改,LPCTSTR = 輸入/只讀。

Windows TCHAR 模型是雙刃劍:簡化了雙版本維護,但若不理解字串字面值型別與 API 參數修飾符的對應關係,極易在 C 專案中引入隱性 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved