Символ для ACHAR + objectARX
Я пытаюсь преобразовать предыдущий код в VS 2010. Код, который я пытаюсь преобразовать, упомянут ниже. Функция addCommand определяется как
addCommand(const ACHAR * cmdGroupName, const ACHAR * cmdGlobalName, const ACHAR * cmdLocalName, Adesk::Int32 commandFlags, AcRxFunctionPtr FunctionAddr,AcEdUIContext *UIContext=NULL, int fcode=-1, HINSTANCE hResourceHandle=NULL, AcEdCommand** cmdPtrRet=NULL)
Третий обязательный аргумент имеет тип ACHAR. Функция вызывается следующим образом.
char cmdLocRes[65];
// If idLocal is not -1, it's treated as an ID for
// a string stored in the resources.
if (idLocal != -1) {
// Load strings from the string table and register the command.
::LoadString(_hdllInstance, idLocal, cmdLocRes, 64);
acedRegCmds->addCommand(cmdGroup, cmdInt, cmdLocRes, cmdFlags, cmdProc);
Моя проблема в том, что переменная cmdLocRes имеет тип char, но аргумент должен быть типа ACHAR.
Как я могу конвертировать то же самое?
1 ответ
- ACHAR - это typedef (сделанный Autodesk в файле AdAChar.h) из wchar_t. Так что вопрос в том, как преобразовать символ в wchar_t.
- В более широком контексте эта проблема связана с существованием Unicode. Программисты Linux и Windows обычно обсуждают это, не понимая друг друга. Поскольку я тоже этого не понимаю, я не могу этого объяснить. Есть потоки для страстного бобра: что "не так" с C++ wchar_t и wstrings? Какие есть альтернативы широким символам?
Фоллинг может дать вам представление о том, как его преобразовать.
// Convert char to wchar_t
char cmdLocRes [65];
// Замечание: убедитесь, что cmdLocRes содержит элементы!
cmdLocRes [0] = 'A';
cmdLocRes [1] = '\ 0';
// Получить wstringstream
std:: wstringstream str;
// Записываем массив char в wstringstream
str << cmdLocRes;
// Получить строку wstringstream
std:: wstring wstr = str.str ();
// Получить wchar_t из строки
const wchar_t * chr1 = wstr.c_str ();
const ACHAR * chr2 = wstr.c_str (); // Мы видим, что wchar_t == ACHAR!
Лучше подумайте об использовании wchar_t cmdLocRes[65] вместо char cmdLocRes[65]!
- Извините за стиль кода, но это текстовое поле является еще одним хорошим примером того, как этого не делать. Мне потребовалось больше времени, чтобы попытаться отформатировать блок кода (и, пожалуйста, посмотрите на него!!!), чем написать ответ. Иисус!!!