При назначении ANSI CStringW
вызывается WinAPI MultiByteToWideChar
.Это похоже на следующее:
csTest = "a"; // <- step in to this line with debugger
->
wchar_t *buf = new wchar_t[10];
MultiByteToWideChar(CP_ACP, 0, "a", -1, buf, 1);
//Error 122, ERROR_INSUFFICIENT_BUFFER
//MultiByteToWideChar is expecting 2, not 1, for len
DWORD err = GetLastError();
delete[]buf;
Проблема возникает из-за того, что CString
использует длину "a"
и не учитывает нулевой символ.MultiByteToWideChar
устанавливает ошибку.
CString
позже исправляет проблему, но GetLastError
все еще установлен.
Просто используйте csTest = L"a";
, чтобы избежать необходимости преобразования.Или csTest = CA2W("a");
В противном случае GetLastError
не следует использовать таким образом.Используйте GetLastError
сразу после сбоя функции WinAPI.
Тестирование:
#include <Windows.h>
#include <AtlStr.h>
int main()
{
DWORD err;
CStringW str;
wchar_t *buf = new wchar_t[10];
int len = MultiByteToWideChar(CP_ACP, 0, "a", 1, NULL, 0);
MultiByteToWideChar(CP_ACP, 0, "a", -1, buf, len);
err = GetLastError();
printf("MultiByteToWideChar error %d\n", err);
delete[]buf;
//Below is wrong usage of GetLastError(), it's only for this discussion...
SetLastError(0);
str = "a";
err = GetLastError();
printf("assignment operator error %d\n", err);
SetLastError(0);
str = CA2W("12345");
err = GetLastError();
printf("CA2W error %d\n", err);
return 0;
}
Вывод:
MultiByteToWideChar error 122
assignment operator error 122
CA2W error 0