Почему PCTSTR не определен, а LPCTSTR определен? - PullRequest
1 голос
/ 30 января 2012

Мне было поручено обновить старый код, написанный на MSVC ++ 6. Я получил неизвестное определение для PCTSTR, но оно не было определено, даже если я включил tchar.h.Из моего предыдущего опыта я знаю, что существует LPTSTR, но нет PCTSTR.

Я выполняю поиск в папке C: \ Program Files \ Microsoft Visual Studio \ VC98 \ Include \ и не нашел определения PCTSTR.Но к моему удивлению, когда я искал папку Windows SDK [C: \ Program Files \ Microsoft SDK], там не было определения PCTSTR, но он использовался в одном из примеров.[C: \ Program Files \ Microsoft SDK \ Samples \ winui \ Resource \ Iconpro *].Так что я предполагаю, что это может быть просто реликтом из Windows API 16-битных окон, но я ничего не могу найти в Google.

Кто-нибудь знает, для чего предназначен PCTSTR.Я думаю, так как это было из старого кода, который работает раньше.Есть идеи, как сделать эту компиляцию?[Я изменил это на LPCTSTR, и он скомпилирован, я хочу знать, есть ли другие способы, кроме изменения имени определения]

Ответы [ 2 ]

9 голосов
/ 30 января 2012

LP в LPCTSTR означает Long Pointer.Это артефакт от Windows 3 дней, 16-битной операционной системы.В 16-битном коде было несколько моделей памяти, которые пытались адресовать более 65536 байт памяти, когда у вас есть только 16-битный регистр процессора.Короткий указатель использовал значение регистра сегмента данных по умолчанию и 16-битное смещение.Длинный указатель был 32-разрядным, 16-разрядным для загрузки регистров сегмента и 16-разрядным для смещения.

T в LPCTSTR означает TCHAR, typedef для char или wchar_t, в зависимости от наличияМакрос UNICODE.

Что делает PCTSTR временным анахронизмом, стилем фильма о людях и динозаврах.Никогда не было 16-битной версии Unicode для Windows, 32-битные версии Windows всегда используют 32-битные указатели.Это звучит просто как ошибка.Тем не менее, текущая версия winnt.h имеет typedef для него, что делает его таким же, как LPCTSTR.И используется только в одном месте, заголовок stralign.h со странной функцией с именем TSTR_ALIGNED_STACK_COPY.Однако только в комментарии.

Ошибка.Ваш обходной путь был правильным выбором.

0 голосов
/ 30 января 2012

В Windows SDK v7.0a, установленном на моем компьютере, WinNT.h содержит два разных typedef для PCTSTR, в зависимости от того, определено ли UNICODE.В обоих случаях LPCTSTR определяется одинаково - поэтому эти два в настоящее время эквивалентны.

...