如何在不使用带有 TEXT() 的字符串文字的情况下为 TCHAR* 赋值?

How do I assign a value to TCHAR* without using a string literal with TEXT()?

我需要在 C++ 中为 TCHAR* 变量赋值,有人告诉我这是使用 TEXT() 宏完成的。但是,我发现我只能在使用字符串文字时执行此操作。

//This assignment uses a string literal and works
TCHAR* name = TEXT("example");

//This assignment uses a local variable and causes an error
char* example = "example";
TCHAR* otherName = TEXT(example);

如果不是因为 TEXT() 引用参数的值将由用户在运行时确定这一事实,这将不是问题。因此,我需要将值存储在某种局部变量中并将其传递给 TEXT() 宏。我如何使用 TEXT() 而不是字符串文字来使用局部变量?还是有另一种方法可以将值分配给 TCHAR* 变量?

TEXT() 宏仅适用于编译时的文字。对于非文字数据,您必须改为执行运行时转换。

如果为项目定义了 UNICODETCHAR 将映射到 wchar_t,并且您必须使用 MultiByteToWideChar()(或等效项)将您的 char* 值到 wchar_t 缓冲区:

char* example = "example";
int example_len = strlen(example);
int otherName_len = MultiByteToWideChar(CP_ACP, 0, example, example_len, NULL, 0);
TCHAR* otherName = new TCHAR[otherName_len+1];
MultiByteToWideChar(CP_ACP, 0, example, example_len, otherName, otherName_len);
otherName[otherName_len] = 0;
// use otherName as needed ...
delete[] otherName;

如果未定义 UNICODETCHAR 将映射到 char,您可以直接分配 char*

char* example = "example";
TCHAR* otherName = example;

我建议使用 C++ 字符串来帮助您:

std::basic_string<TCHAR> toTCHAR(const std::string &s)
{
    #ifdef UNICODE
    std::basic_string<TCHAR> result;
    int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.length(), NULL, 0);
    if (len > 0)
    {
        result.resize(len);
        MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.length(), &result[0], len);
    }
    return result;
    #else
    return s;
    #endif
}

char* example = "example";
std::basic_string<TCHAR> otherName = toTCHAR(example);