首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VS2012 MFC 專案中 CStringW 無法隱含轉換為 LPCTSTR 的編譯錯誤解決方案

     編輯:程式設計綜合問答

錯誤現象

將舊 VC++ 6.0 專案遷移至 VS2012 後,呼叫 CListCtrl::SetItemText 時出現:

error C2664: 'CListCtrl::SetItemText': 無法將參數 3 從 'CStringW' 轉換為 'LPCTSTR'

原因:VS2012 預設使用 Unicode 字元集,CString 實際為 CStringW(wchar_t*),而 SetItemText 期望 LPCTSTR(在 Unicode 專案中同為 const wchar_t*),但 CStringW 不提供隱含轉換運算子,需顯式轉型。

快速修復:顯式轉型

m_ctrList.SetItemText(i, 1, (LPCTSTR)rs.m_data.Format(_T("%Y-%m-%d")));
m_ctrList.SetItemText(i, 2, (LPCTSTR)rs.m_name);
// ... 其餘同理

或使用 GetString() / GetBuffer() 取得原始指標。

根本原因與最佳實踐

  • Unicode 專案下 LPCTSTR = LPCWSTR,但 MFC 故意移除 CStringW::operator LPCTSTR() 隱含轉換,強制開發者明確意圖,避免 ANSI/Unicode 混用導致的難以發現 Bug。
  • 建議統一專案字元集(專案屬性 → 一般 → 字元集),若必須支援 ANSI/Unicode 雙版本,善用 _T()、TEXT() 宏與 CString 模板類別。
  • ODBC 讀取 Access 時,欄位對應的 CString 類型已自動變為 CStringW,務必在傳遞給 Win32 API 或 MFC 控件方法前做顯式轉型。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved