ATL::CA2WEX<> str("test");
printf("%S %08X", str, str);
вывод: test 00650074
стэк перед вызовом printf такой:
0012FBAC 00408148 ASCII "%S %08X" первый аргумент
0012FBB0 0012FDC4 UNICODE "test" второй аргумент
0012FBB4 00650074 третий аргумент
почему второй и третий аргументы в стеке у printf отличаются? ведь компилятор не может в compile time определить типы аргументов printf
CA2WEX это простенький ATL класс для хранения и конвертации строк, сорс здесь C:\program files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h