2016-01-26 4 views
1

У меня есть два разных проекта на C++, один из них компилируется в статическую библиотеку и использует кодировку символов Unicode, поскольку он поддерживает несколько языков (Spell Checker), другой - это устаревший проект MFC, который использует кодирование MultiByteCharacterSet.Преобразовать элемент lpstrtext структуры TEXTRANGE в MultiByteCharacterSet

Унаследованный проект должен использовать проект библиотеки (чтобы Spell проверял содержимое элемента управления richedit в интерактивном режиме).

Когда я создаю одиночный проект с контролем richedit, задайте кодировку символов в unicode и ссылайтесь на библиотеку, она отлично работает. но когда я пытаюсь ссылаться на библиотеку из старого проекта так же, как я сделал с одиноким проектом, он не работает.

Я исследовал и понял, что структура TEXTRANGE, заполняемая EM_GETTEXTRANGE, ожидает значение Unicode в его члене lpstrtext, чего не было бы для старого проекта. реализация в библиотеке выглядит следующим образом:

TEXTRANGE txtRange; 
    memset (&txtRange, 0, sizeof(txtRange)); 
    memset (bufW, 0, sizeof (bufW)); 
    //debug_log("Size of TEXTRANGE: x: %d and Size of BufW: %d.", sizeof(txtRange), sizeof(bufW)); 
    txtRange.lpstrText = string_from_unicode_cp(bufW, CP_ACP); 
    txtRange.chrg.cpMin = 0; 
    txtRange.chrg.cpMax = _countof(bufW); 
    debug_log("count of bufw: %s.", bufW); 
    SendMessage (hwnd, EM_GETTEXTRANGE, 0, (LPARAM)&txtRange); 
    debug_log("txtRange.lpstrText is: %S",txtRange.lpstrText); 

, но я получаю сообщение об ошибке:

SpellChecker.cpp(215): error C2440: '=' : cannot convert from 'char *' to 'LPWSTR' 
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

Visual Studio говорит, что член lpstrtext ИНТ он библиотека LPWSTR (возможно, из-за выбранный формат UNICODE) , что понятно.

Мой вопрос: есть ли способ заставить lpstrtext член ожидать LPSTR (cast), даже если проект, содержащий его, установлен на использование unicode.

+0

Возможно, вам нужна функция ['MultiByteToWideChar'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd319072 (v = vs.85) .aspx). –

ответ

2

TEXTRANGE макрос:

#ifdef UNICODE 
#define TEXTRANGE TEXTRANGEW 
#else 
#define TEXTRANGE TEXTRANGEA 
#endif // UNICODE 

Таким образом, вы должны быть в состоянии использовать TEXTRANGEA вместо того, чтобы заставить char* типа.

+0

Спасибо @ Vlad, ваш ответ отвечает на мой вопрос, но, к сожалению, не решает мою проблему. – Ashahmali

+0

Ну, может быть, вы должны задать другой вопрос тогда :) Во всяком случае, большинство функций Microsoft API - это макросы, определенные на основе настройки _UNICODE. Это затрудняет смешивание _UNICODE с MBCS. Но если вы должны - ваша библиотека должна явно выставлять две версии каждой функции, которые должны быть явно вызваны ее клиентами. –

+0

Спасибо @Vlad, ваш ответ отвечает на мой вопрос, но, к сожалению, не решает мою проблему. Другими словами, существует ли способ создать элемент Richedit в MBCS-кодированном MFC-приложении, но richedit должен быть кодирован в кодировке Unicode (или способом преобразования символьной кодировки MFC richedit HWND из MBCS в UNICODE без изменения кодировки формат всего проекта). – Ashahmali