不要在介面定義中使用 TCHAR 字串

2021-05-18 00:52:07 字數 1022 閱讀 5410

本文** 李馬:http://blog.titilima.com/show-568-1.html

其實在我最初的構想中,這個對話方塊的提示文字並不是系統預設的文字,而應該是我寫上去的——最起碼把「windows」替換成 「july」。

但是我最後放棄了,因為我寫上去的字到最後顯示出來是亂碼。由於 runfiledlg 這個 api 並沒有詳細的文件支援,而且其時的我也沒有任何逆向的能力,所以乾脆把文字引數給了個 null,直接用預設提示算球了。

現在回想起來其實是 tchar 惹的禍。在當時,我從網上得到的 runfiledlg 宣告是類似這個樣子:

我的開發環境是 vc6,工程設定沒改過。於是一呼叫,亂碼個球了。因為 runfiledlg 的字串引數實際上是 lpcwstr,而 vc6 缺省會把 lpctstr 定義為 lpcstr。

我想,現在該重新審視一下 tchar 的意義了。它,以及 lptstr、lpctstr 都是乙個 typedef,而並非乙個具體的型別。它會隨著編譯器是否定義了 unicode 巨集而指向真正的型別,也就是 wchar 或 char。換句話說,tchar 的確實現了 unicode 和 ansi 編碼的相容,但這種相容是在源**一級的,在編譯好的 pe 可執行映像中,該是什麼還是什麼。考慮下面的**:

我曾見過無數類似的**,甚至我也這麼寫過。在 ansi 的編譯環境下,這麼寫是沒問題的,但是如果定義了 unicode,那麼這段**就會收到編譯錯誤,因為 lstrcpy 將會被定義成 lstrcpyw,需求的引數型別是 lpwstr 和 lpcwstr。

也許你會說:我自己有能力控制我的源**,知道自己用的是 lstrcpya 還是 lstrcpyw,你管得著麼?

的確,這是你的自由,我也不會干涉你的**風格,更不會質疑你對**的控制力。

但是,如果你的**要提供給別人,而且你提供的只是乙個介面;甚至,這個介面跨越了 pe 邊界,那你總應該負點責吧?

別讓你那含混不清的 tchar 給你們雙方都帶來麻煩。

本文** 李馬:http://blog.titilima.com/show-568-1.html

不要在介面定義中使用 TCHAR 字串

先上個圖,july 早期版本的 執行 對話方塊。其實在我最初的構想中,這個對話方塊的提示文字並不是系統預設的文字,而應該是我寫上去的 最起碼把 windows 替換成 july 但是我最後放棄了,因為我寫上去的字到最後顯示出來是亂碼。由於 runfiledlg 這個 api 並沒有詳細的文件支援,而...

不要在v for中使用v if

一 前言 以下 寫法,相信80 的初學者寫過,即使沒寫過,也應該見過!v for product in products key product.id v if product.price 50 li ul 使用 v if 來過濾 v for 迴圈的資料是乙個超級大錯誤!儘管這看起來很直觀,但它會導...

不要在標頭檔案中使用using namespace

在這裡,我毫不迴避地說了這句話 引用我再也不想在任何標頭檔案中看到 using namespace 了 作為乙個開發者 團隊領導者,我經常會去招聘新的專案成員,有時候也幫助其他組的人來面試應聘者。作為應聘流程之一,我經常要求應聘者寫一些 因此我檢查過相當多的 在最近提交的c 中,我注意到乙個趨勢,在...