Основная проблема с типом данных C - const char * to LPCTSTR - PullRequest
0 голосов
/ 22 июля 2010
#include "stdafx.h"
#include "string.h"
#include "windows.h"
bool SCS_GetAgentInfo(char name[32],char version[32], char description[256], const char * dwAppVersion)
{
    strcpy(name,gName);
    strcpy(version,gVersion);
    strcpy(description,gDescription);
    notify(dwAppVersion);
    return true;
}

void notify(const char * msg)
{
    MessageBox(NULL, TEXT(msg), NULL, NULL);
}

Мне удалось нормально работать с первыми тремя полями, но у меня возникли проблемы с const char *.Я пробовал проходить и кастовать разными способами, но не могу заставить его работать.Я гуглил вокруг, но не мог найти много на Lmsg.Я новичок в этом.Я прочитал вокруг, и я думаю, что это может иметь отношение к кодированию.Что меня действительно смущает, так это то, что LPCTSTR определяется как const char *, но прямое приведение типов ничего не дает из поля.

Я получаю сообщение об ошибке, что Lmsg не объявлен, что, как я предполагаю, означает, что расширение Macroиз текста вызывает это.Как я могу заставить это работать?

Выполнение MessageBox(NULL, (LPCTSTR)msg, NULL, NULL); вместо этого дает мне кучу ящиков, указывающих, что он, вероятно, ссылается на неправильные символы, но копирование параметра dwAppsVersion в описание показывает правильную информацию.

Ответы [ 3 ]

2 голосов
/ 22 июля 2010

Проблема в том, что вы создаете свое приложение для использования UNICODE Win32 API, но вы передаете строки, не являющиеся UNICODE.У вас есть два варианта:

  1. преобразовать строку msg в Unicode, используя что-то вроде MultiByteToWideChar().Это, вероятно, «правильный» способ сделать это, если он немного сложнее, потому что вам нужно работать с кодовыми страницами и управлять буферами, используемыми для преобразования.

  2. вы можете принудительно настроить ANSIиспользуемая версия API:

    MessageBoxA(NULL, msg, NULL, NULL); 
    

Это простой обходной путь, если не изящный.

Другие варианты включают только создание приложения для использования Win32 ANSI APIвместо этого API Unicode или изменение строк, которые вы передаете как LPTSTR, и использование макросов TEXT() или _T() для ваших литералов.Однако, если вы читаете не-Unicode данные из файлов или где-то еще, вам все равно придется иметь дело с преобразованием в какой-то момент ...

1 голос
/ 22 июля 2010

Трудно точно сказать, что происходит в вашем вопросе, так как вы, кажется, оставили какой-то соответствующий контекст.Например, LPCTSTR нигде не упоминается, поэтому я могу только догадываться о том, о чем вы говорите, или о том, что означают «первые три поля».

Следует отметить, что LPCTSTR не всегда const char*, это в сборке ANSI, но это const wchar_t* в сборке Unicode.Скорее всего, это проблема, с которой вы столкнулись.

Кроме того, макрос TEXT () предназначен только для определения строковых констант.Вы не можете использовать его для преобразования переменной, поэтому вы получаете «Lmsg undeclared».

Если вы не намеренно используете сборку Unicode, вы можете изменить свой проектнастройки для сборки ANSI в качестве обходного пути.В противном случае вы можете прочитать учебник по работе с Unicode, с которым вы действительно должны быть знакомы, если вы пишете программное обеспечение для Windows в наши дни.

1 голос
/ 22 июля 2010

LPCTSTR - это псевдоним для const TCHAR *, а TCHAR - это тип, используемый в программировании Windows для облегчения перехода между ANSI ( Windows-1252 , очень похожий на международный стандарт ISO 8859-1 ) и Unicode кодировки текста .

Если ваш проект настроен на сборку приложения с использованием ANSI, TCHARдействительно char, и вы могли бы передать msg в MessageBox без приведения.

Если ваше приложение настроено на сборку с использованием Unicode (как это звучит), TCHAR на самом деле wchar_t, и вам придется преобразовать строку из ANSI в Unicode, используя такую ​​функцию, как MultiByteToWideChar().

Простое приведение просто заставляет компилятор интерпретировать тип по-разномубез изменения данных;в этом случае этого недостаточно, поскольку фактические данные должны быть преобразованы из одного формата в другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...