2012-01-30 141 views
1

我已被分配用於更新用MSVC++編寫的舊代碼。我一直在獲取PCTSTR的未知定義,但即使包含tchar.h,也未定義它。在我以前的經驗中,我知道有一個LPTSTR,但沒有PCTSTR。爲什麼PCTSTR未定義,但定義了LPCTSTR?

我grep的C:\ ProgramFiles \ Microsoft Visual Studio \ VC98 \ Include \文件夾,並沒有找到PCTSTR的定義。但令我驚訝的是,當我搜索Windows SDK文件夾[C:\ Program Files \ Microsoft SDK]時,沒有PCTSTR的定義,但它在其中一個示例中使用。 [C:\ Program Files \ Microsoft SDK \ Samples \ winui \ Resource \ Iconpro *]。所以我猜測,這可能只是來自16位窗口的Windows API的遺留物,但我無法從谷歌中找到任何東西。

有誰知道什麼是PCTSTR。我猜測,因爲這是來自以前工作的舊代碼。任何想法如何使這個編譯? [我改變了這個LPCTSTR和編譯,我想知道是否有其他方式,而不是改變定義名稱]

回答

9

LPCTSTR中的LP表示長指針。這是一款來自Windows 3天(一款16位操作系統)的神器。當你只有一個16位的cpu寄存器時,16位代碼有幾個內存模型來處理超過65536字節的內存。一個短指針使用默認的數據段寄存器值和一個16位偏移量。長指針是32位,16位用於加載段寄存器,16位用於偏移量。

LPCTSTR中的T表示TCHAR,它是char或wchar_t的typedef,具體取決於UNICODE宏的存在。

這使得PCTSTR時代不符合人類和恐龍的電影​​風格。從來沒有一個16位的Unicode版本的Windows,32位版本的Windows總是使用32位指針。這聽起來只是一個錯誤。儘管如此,當前版本的winnt.h 確實爲有一個typedef,使其與LPCTSTR相同。並且只用於一個的地方,stralign.h頭帶有一個名爲TSTR_ALIGNED_STACK_COPY的奇怪函數。但只有在評論中。

錯誤。您的解決方法是正確的選擇。

+0

當我讀到你的寫作時,有時候我有一種幻覺,因爲你看起來像Raymond Chen。 :) – Benjamin 2012-01-30 16:32:30

+0

呵呵,我們年齡差不多,可能跟它有點關係。 – 2012-01-30 17:09:02

+0

哇。不過,Raymond Chen已經住在SO。你知道嗎? http://stackoverflow.com/users/902497/raymond-chen – Benjamin 2012-01-31 03:12:43

0

在Windows SDK v7.0a我有我的機器上,WinNT.h包含兩個不同的typedefs PCTSTR,取決於確定是否定義了UNICODE。在這兩種情況下,LPCTSTR都以同樣的方式定義 - 所以這兩個現在是等效的。