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

Visual Studio 2013 編譯舊版 Win32 API 程式:Unicode 字元集與 _T() 宏修正指南

     編輯:程式設計綜合問答

錯誤原因

VS2013 專案預設 字元集:Unicode(UNICODE, _UNICODE 定義),導致:

  • MessageBox 解析為 MessageBoxW,需寬字串 L"文字"。
  • RegisterClassEx 結構體 lpszClassName 為 LPCWSTR。
  • 字串常數 "Hello" 為 const char*,型別不匹配。

修正方案

  1. 使用 _T() / TEXT() 宏(推薦,支援雙模式):
    MessageBox(NULL, _T("Hello World!"), _T("MsgBox"), 0);
    WNDCLASSEX wc = {0};
    wc.lpszClassName = _T("MyWindowClass");
    
  2. 或專案屬性 → 字元集 → 「使用多位元組字元集」(MBCS),則所有 API 對應 ANSI 版本,字串常數無需修改。
  3. 顯式呼叫寬字串版本:MessageBoxW(NULL, L"Hello", L"Title", 0),但需逐一修改所有 API 呼叫。

完整修正範例

#include <windows.h>
#include <tchar.h>

int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpCmd, int nShow) {
    MessageBox(NULL, _T("Hello World!"), _T("MsgBox"), 0);
    return 0;
}

// 第二個程式同理,所有字串常數包 _T(),入口點改 _tWinMain

關鍵點

  • _tWinMain 是 WinMain 的巨集,根據字元集對應 wWinMain 或 WinMain。
  • TCHAR、LPTSTR、LPCTSTR 等類型配合 _T() 可自動適配 Unicode/MBCS。
  • 新專案建議直接選 Unicode,並習慣使用 _T(),避免未來移植麻煩。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved