windows開發(fā)-TCHAR之痛

說到TCHAR,大家應(yīng)該是不陌生雁佳。

TCHAR簡介

為什么會有TCHAR,因?yàn)镃++支持兩種字符集,如下:

  • ANSI字符集:Multi-Byte Character
  • Unicode字符集:Unicode Character

VS2008中字符集設(shè)置:
右鍵工程-“Properties”-“Configuration Properties”-“General”-“Character Set”厅瞎。

微軟baba為了統(tǒng)一這兩套編碼,所以有了TCHAR這個(gè)怪咖初坠,通過條件編譯(_UNICODE宏和UNICODE宏)控制實(shí)際使用的字符集和簸。

TCHAR詳細(xì)信息

  • Use Unicode Character Set,其定義如下:
    typedef WCHAR TCHAR, *PTCHAR
    其中WCHAR的定義為:typedef wchar_t WCHAR
  • Use Multi-Byte Character Set碟刺,其定義如下:
    typedef char TCHAR, *PTCHAR

已知char類型長度為1個(gè)字節(jié)锁保,而wchar_t類型長度為2個(gè)字節(jié);

那么可知,TCHAR類型在Multi-Byte字符集下占1個(gè)字節(jié)身诺,在Unicode字符集下占2個(gè)字節(jié)蜜托。

同一個(gè)TCAHR類型的數(shù)組變量在不同字符集下,長度是不同的霉赡。
TCHAR ptszArray[10];

  • 在Unicode字符集下橄务,長度為20個(gè)字節(jié)
  • 在Multi-Byte字符集下,長度為10個(gè)字節(jié)

問題

扯了這么多閑話穴亏,說說正事
這次問題牽涉到一個(gè)dll和exe蜂挪,大致情況如下:

dll:Unicode字符集
exe:Multi-Byte字符集

exe加載dll后通過一個(gè)獲取函數(shù)列表接口獲取所有函數(shù)指針,該接口的參數(shù)為一個(gè)函數(shù)指針結(jié)構(gòu)體嗓化,大致如下:

typedef struct BLKFUNLISTTAG
{
  TCHAR   m_ptszDevName[10];
  Fun1    m_pFun1;
  Fun2    m_pFun2;
}BlkFunList, *pBlkFunList;

dll和exe中都是使用TCHAR數(shù)組棠涮,導(dǎo)致在dll中明明結(jié)構(gòu)體中的2個(gè)函數(shù)指針已經(jīng)被賦值;但是運(yùn)行到exe后刺覆,卻發(fā)現(xiàn)2個(gè)函數(shù)指針的值全為零严肪。WTF!!!
后來經(jīng)過分析,是TCHAR搗的鬼谦屑。

在dll中TCHAR實(shí)際上是wchar_t驳糯,則m_ptszDevName[10]的長度為20個(gè)字節(jié),而到了exe后氢橙,TCHAR實(shí)際上是char酝枢,其長度為10個(gè)字節(jié)。
假如DevName為"HID"悍手,由于dll為Unicode字符集帘睦,則其內(nèi)存信息如下:
\x00\x68\x00\x69\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
exe里拿到上面這段內(nèi)存地址,會按照char類型去解析坦康。則只會取前面10個(gè)字節(jié)的數(shù)據(jù):
\x00\x68\x00\x69\x00\x64\x00\x00\x00\x00
剩余的10個(gè)字節(jié)就會覆蓋結(jié)構(gòu)體后面的兩個(gè)函數(shù)指針成員竣付,最終導(dǎo)致2個(gè)函數(shù)指針的值為0。
哎涝焙,想想都覺得可怕卑笨。

解決方案

為了不影響dll和exe中現(xiàn)有代碼,所以只是將exe中結(jié)構(gòu)體定義中的m_ptszDevName的類型由TCHAR改為WCHAR仑撞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赤兴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隧哮,更是在濱河造成了極大的恐慌桶良,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮翔,死亡現(xiàn)場離奇詭異陨帆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門疲牵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來承二,“玉大人,你說我怎么就攤上這事纲爸『ヰ” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵识啦,是天一觀的道長负蚊。 經(jīng)常有香客問我,道長颓哮,這世上最難降的妖魔是什么家妆? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮冕茅,結(jié)果婚禮上伤极,老公的妹妹穿的比我還像新娘。我一直安慰自己嵌赠,他們只是感情好塑荒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布熄赡。 她就那樣靜靜地躺著姜挺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彼硫。 梳的紋絲不亂的頭發(fā)上炊豪,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音拧篮,去河邊找鬼词渤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛串绩,可吹牛的內(nèi)容都是我干的缺虐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼礁凡,長吁一口氣:“原來是場噩夢啊……” “哼高氮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顷牌,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剪芍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后窟蓝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罪裹,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了状共。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片套耕。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖峡继,靈堂內(nèi)的尸體忽然破棺而出箍铲,到底是詐尸還是另有隱情,我是刑警寧澤鬓椭,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布蒿讥,位于F島的核電站华嘹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剑鞍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芥炭。 院中可真熱鬧晴股,春花似錦、人聲如沸踊赠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筐带。三九已至今穿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伦籍,已是汗流浹背蓝晒。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帖鸦,地道東北人芝薇。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像作儿,于是被迫代替她去往敵國和親洛二。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 原創(chuàng)作者:http://blog.sina.com.cn/s/blog_4b4409c30100vw9t.html...
    Caiaolun閱讀 1,024評論 0 0
  • UTF-8 編碼提供了一種簡便而向后兼容的方法, 使得那種完全圍繞 ASCII 設(shè)計(jì)的操作系統(tǒng), 比如 Unix,...
    謝大見閱讀 4,737評論 0 3
  • 文章地址? 文章匯總 工程結(jié)構(gòu) External Dependencies工程的外部依賴文件攻锰,這個(gè)目錄是VS自動生...
    CrazyTiger閱讀 433評論 0 0
  • 說明:本文是我在readthedocs看到的晾嘶,覺得很不錯(cuò)所以轉(zhuǎn)載過來,有刪改口注,原文地址點(diǎn)這里变擒。 實(shí)用Unicode...
    aurora閱讀 987評論 0 6
  • 從華為獲悉:華為將于今年全球商用的 5G NR(第五代移動通信新無線接入技術(shù),以下簡稱 5G)產(chǎn)品寝志,獲得全球第一張...
    7438330ae1df閱讀 299評論 0 0