函数不返回正确的TCHAR

时间:2014-05-18 05:20:19

标签: c++

我正在尝试创建一个只返回TCHAR或LPCWSTR的函数,我无法处理它,不知道为什么!

我的代码如下:

TCHAR MainClass::GetString(){
    if (hWnd == NULL)
        return NULL;

    TCHAR name[256];
    GetWindowText(hWnd, name, 256);
    MessageBox(NULL, (LPCWSTR)(name), L"Testing this!", MB_OK);
    return name[256]; 
}

如果我运行此代码,它会显示一个消息框,就像我想要的消息一样,但返回的是一个空白字符串。

如果我尝试返回LPCWSTR,它也会返回空白,我在这里做错了什么?

- 修改

TCHAR* MainClass::GetString(){
if (hWnd == NULL)
    return NULL;

TCHAR name[256];
GetWindowText(hWnd, name, 256);

return (TCHAR *)malloc(sizeof(name)); 
}

2 个答案:

答案 0 :(得分:2)

您的函数返回TCHAR,它将是单个char或单个wchar_t,具体取决于是否定义了UNICODE

语句return name[256]返回从name数组开头偏移256处的单个字符。这意味着您将返回单个TCHAR 一个超过数组末尾的。这就是为什么你没有得到你期望的字符串。

您无法声明自动堆栈变量并从函数返回指向它的指针 - 当函数退出时,它会超出范围。

您可能想要malloc()字符串,向其返回TCHAR*,然后在调用函数中free()

答案 1 :(得分:0)

试试这个:

std::basic_string<TCHAR> MainClass::GetString()
{
    TCHAR name[256] = {0};
    int len = GetWindowText(hWnd, name, 256);
    return std::basic_string<TCHAR>(name, len); 
}

或者这个:

std::basic_string<TCHAR> MainClass::GetString()
{
    int len = GetWindowTextLength(hWnd);
    if (len == 0) return std::basic_string<TCHAR>();
    std::vector<TCHAR> name(len+1);
    len = GetWindowText(hWnd, &name[0], name.size());
    return std::basic_string<TCHAR>(&name[0], len); 
}

无论哪种方式,你都可以这样做:

std::basic_string<TCHAR> name = GetString();

可替换地:

int MainClass::GetString(LPTSTR name, int maxlen)
{
    return GetWindowText(hWnd, name, maxlen);
}

TCHAR name[256];
int namelen = GetString(name, 256);