Модификация C ++ DLL для поддержки юникода - распространенные ошибки, которых следует избегать? - PullRequest
1 голос
/ 04 мая 2009

У меня есть Windows DLL, которая в настоящее время поддерживает только ASCII, и мне нужно обновить ее для работы со строками Unicode. Эта DLL в настоящее время использует строки char * в нескольких местах, а также выполняет несколько вызовов ASCII Windows API (таких как GetWindowTextA, RegQueryValueExA, CreateFileA и т. Д.).

Я хочу перейти на использование макросов unicode / ascii, определенных в VC ++. Поэтому вместо char или CHAR я бы использовал TCHAR. Для char * я бы использовал LPTSTR. И я думаю, что такие вещи, как sprintf_s, будут изменены на _stprintf_s.

Я никогда раньше не имел дело с юникодом, поэтому мне интересно, есть ли какие-нибудь распространенные подводные камни, на которые я должен обратить внимание при выполнении этого. Должно ли это быть так же просто, как достаточно заменить имена типов и методов соответствующими макросами, или есть другие сложности, на которые стоит обратить внимание?

Ответы [ 2 ]

4 голосов
/ 04 мая 2009

Сначала прочитайте эту статью Джоэла Спольски: Абсолютный минимум, который должен знать каждый разработчик программного обеспечения Абсолютно, положительно, необходимо знать о Unicode и наборах символов (без оправданий!)

Затем перейдите по этим ссылкам в Переполнение стека:

Что мне нужно знать о Unicode?

Как правило, вы ищете любой код, который принимает один символ = один байт (выделение памяти / буфера и т. Д.). Но ссылки выше приведут вам довольно краткое изложение деталей.

1 голос
/ 04 мая 2009

Самой большой опасностью могут быть размеры буфера. Если ваши выделения памяти сделаны с точки зрения sizeof (TCHAR), вы, вероятно, будете в порядке, но если есть код, в котором исходный программист предполагал, что символы имеют размер 1 байт каждый, и они использовали целые числа в выражениях malloc, то трудно глобальный поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...