Ваш каст в CharLower вызывает эту ошибку. Перед этим необходимо установить старший байт указателя, передаваемого в CharLower равно нулю.
Из ссылки MSDN на функцию:
Если операнд является символьной строкой,
функция возвращает указатель на
преобразованная строка Потому что строка
конвертируется на месте, возврат
значение равно lpsz.
Если операнд представляет собой один символ,
возвращаемое значение является 32-битным значением
чье старшее слово равно нулю, и
младшее слово содержит преобразованный
характер.
Примерно так может работать:
#define ltolower(ch) CharLower(0x00ff & ch)
Если вы используете компилятор C ++, вам также может понадобиться оператор CAST:
#define ltolower(ch) CharLower((LPTSTR)(0x00ff & ch))
Хотя не проверял ...