2013-02-11 4 views
0

Я создал модуль, который создает окно с полем редактирования из окна «EDIT windowclass». Он предназначен только для работы с набором символов ansi и без использования какого-либо юникода.Формирование элемента управления ANSI вместо управления редактированием comctl32

Я использую EM_GETHANDLE, чтобы получить буфер для элемента управления редактированием.

Теперь вот моя проблема: (цитата из указанной выше ссылке)

Note For Comctl32.dll version 6, the buffer always contains an array of WCHARs, regardless of whether an ANSI or Unicode function created the edit control. For more information on DLL versions, see Common Control Versions.

Так что, когда мой модуль загружается приложением, которое COMCTL32 инициализирован, весь мой код перерывов.

Мой вопрос: Есть ли способ предотвратить использование CreateWindowA для comclt32 или у кого-нибудь есть идея исправить эту проблему?

+0

Ваш ответ на предупреждение приведен в цитированном тексте. Что такого сложного в Unicode, особенно если вы все равно не собираетесь его поддерживать? Просто выбросьте или проигнорируйте то, что вы не можете обработать или еще лучше, но дайте пользователю сообщение об ошибке, когда они вводят то, что вы не хотите обрабатывать, например. не-ASCII-символы. –

ответ

1

Приложение использует COMCTL32.DLL, если оно указано в манифесте приложения, как описано, например, здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/bb773175%28v=vs.85%29.aspx

Если ваш модуль является DLL, тогда вы можете попробовать использовать некоторую технику изоляции, поэтому он не полагается на версию версии COMCTL32.DLL, которую решил использовать .exe, но это может принести много других недостатков.

Вместо этого я рекомендую использовать WM_GETTEXTA или GetWindowTextA(), который скопирует преобразованную строку в ваш буфер. Проектирование модуля, требующего корректной работы старой версии DLL, - это просто плохая идея.

+0

Спасибо за ваш ответ. Мне нужно использовать 'EM_GETHANDLE', потому что я использую этот дескриптор для непосредственного доступа к буферу элемента управления и также записываю его (я знаю, что я не могу этого делать!). Я думаю, мне нужно использовать CreateWindowW для элемента управления редактирования для решения моей проблемы. – typ1232

+0

Кроме того, используйте 'IsWindowUnicode()', чтобы определить, было ли окно редактирования создано «CreateWindowA()» или «CreateWindowW()», а затем настроить логику буфера для использования «CHAR» или «WCHAR» соответственно. –

Смежные вопросы