Please enable JavaScript to view this site.

1. Код "двойного назначения"

Чтобы иметь возможность реализации приложения в двух вариантах - ANSI и Unicode, следует обеспечить возможность компиляции "двойного назначения". Для этого в проект необходимо добавить новую конфигурацию "Unicode", в свойствах компилятора которой объявить два определения UNICODE и _UNICODE.

2. Типы данных

Тип данных символа Unicode – wchar_t, в отличие от простого char - это 16-битное число! Для возможность компиляции "двойного назначения" (ANSI и Unicode) необходимо использовать тип (макрос) TCHAR, который в зависимости от объявленных определений разворачивается либо в char, либо в wchar_t.

При замене char или char* необходимо понимать назначение переменной с таким типом. Если это строка или символ, то нужно использовать TCHAR, а если это бинарный массив или простой байт данных то byte.

3. Прототипы функций

Код, содержащий явные вызовы str-функций, просто так компилировать с использованием и ANSI и Unicode нельзя. Чтобы реализовать возможность компиляции "двойного назначения", необходимо заменить все функции на _t-образные (макросы,) например strlen на _tcslen или sprintf на _stprintf. Эти макросы заменяют явные вызовы str- или wcs-функций в зависимости от определения _UNICODE.

Так же происходит и с функциями Win32 API, например SetWindowText подразумевает либо SetWindowTextA, либо SetWindowTextW.

4. Символы и строки в С-коде

По умолчанию компилятор транслирует строки как состоящие из символов ANSI, а не Unicode. Чтобы компилятор сгенерировал Unicode-строку перед ней надо добавить букву L, например L"text". Тогда, размещая строку в области данных программы, компилятор вставит между всеми символами нулевые байты. При этом возникает другая проблема - программа компилируется, только если _UNICODE определен. Для этого существует макрос _TEXT() или просто _T(), например _T("text").

5. В API системы КОМПАС все структуры параметров, содержащие строковые переменные имеют аналог для UNICODE c суффиксом W.

При использовании функций GetObjParam / SetObjParam для автоматического выбора структуры параметров используется определение с суффиксом T.

Например:

Тип данных:

 

#ifdef _UNICODE

#define ALLPARAM_T ALLPARAM_W

#else

#define ALLPARAM_T ALLPARAM

#endif // !UNICODE

 

Структура параметров:

//-------------------------------------------------------------------------------

// Структура параметров вида (ANSI)

// ---

struct ViewParam {

unsigned short state; // состояние вида

double x,y; // точка привязки вида

double scale; // масштаб вида

double ang; // угол поворота вида

unsigned long color; // цвет вида в активном состоянии

char name[TEXT_LENGTH]; // имя вида

};

 

//-------------------------------------------------------------------------------

// Структура параметров вида ( Unicode )

// ---

struct ViewParamW {

unsigned short state; // состояние вида

double x,y; // точка привязки вида

double scale; // масштаб вида

double ang; // угол поворота вида

unsigned long color; // цвет вида в активном состоянии

wchar_t name[TEXT_LENGTH]; // имя вида

};

 

#ifdef _UNICODE

#define ViewParamT ViewParamW

#else

#define ViewParamT ViewParam

#endif // !_UNICODE

 

Ссылки:

http://www.microsoft.com/globaldev/getwr/steps/wrg_unicode.mspx

Подразделы:

(отсутствуют)

© ООО «АСКОН-Системы проектирования», 2024. Все права защищены. | Единая телефонная линия: 8-800-700-00-78