CString Caption(static_cast<const char*>(tmp)); //convert it
Это не конвертирует это. Он выдает один символ, если tmp содержит текст на английском языке. И общая поговорка из земли Джиббер, если она содержит арабский текст. Преобразование из UTF-16, как используется OLE Automation и DBGrid, которую вы используете, в 8-битные символы не может быть выполнено с помощью преобразования, для этого требуется функция преобразования. Как WideCharToMultiByte или OLE2A.
Такое преобразование будет воспроизводить разборчивый текст только тогда, когда кодовая страница для потока совпадает с набором символов, используемым в строке. Что, если в сетке отображается арабский язык, а ваша нить или кодовая страница, на которую вы конвертируете - это английский, ничего не дает, кроме множества вопросительных знаков.
Если вы не хотите активировать код в Unicode, вы не можете переключаться между наборами символов на лету. Операционная система, на которой вы запускаете этот код, поддерживает его в течение последних 17 лет.