打印wchar_t时,SetWindowText会崩溃程序

时间:2014-05-06 09:03:14

标签: c++ windows winapi

当我使用SetWindowText()时,为什么我无法在窗口中打印文字?这就是我的窗口创建代码:

game_board[i] = CreateWindowEx(0,
                L"Static",
                board_elements[i],
                WS_CHILD | WS_VISIBLE | WS_BORDER,
                0,
                0,
                0,
                0,
                hwnd,
                (HMENU)IDC_STATICBOARD + i + 1,
                hInst,
                NULL);

当我写下这样的话时:

wchar_t c;
for(i = 0; i < 15; i++){
   c = 'a' + i;
   SetWindowText(game_board[i], c);
   UpdateWindow(game_board[i]);
   }

我的程序在触发该事件后崩溃。

如果我使用SetWindowText(game_board[i], L"TEXT");,它会正常打印TEXT。

我也有这些问题需要预先制作一切,我不知道为什么。

我正在使用VS 13,而project是一个用C ++编写的Windows应用程序。如果我在Codeblocks中复制代码,那么它会为我在VS中创建的每个演员表弹出一个错误,在我全部删除后,它会正常工作。

为什么呢?任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

SetWindowText function需要指向以空字符结尾的字符串的指针。但是你试图将它传给一个角色。

作为一名评论者提到,这段代码甚至不应该编译。你提到了一些关于&#34;需要预制一切的事情&#34;。这可能是问题所在。演员就像告诉编译器并不担心它,我知道我在做什么&#34;。但在这种情况下,你不会。编译器错误试图保护你不犯错误,你应该听。

将代码更改为:

// Declare a character array on the stack, which you'll use to create a
// C-style nul-terminated string, as expected by the API function.
wchar_t str[2];

// Go ahead and nul-terminate the string, since this won't change for each
// loop iteration. The nul terminator is always the last character in the string.
str[1] = L'\0';

for (i = 0; i < 15; i++)
{
   // Like you did before, except you're setting the first character in the array.
   str[0] = L'a' + i;
   SetWindowText(game_board[i], str);
   UpdateWindow(game_board[i]);
}

请注意L前缀。这向编译器表明您正在使用wchar_t类型所需的宽字符/字符串。