C++ 仔细检查我的知识:Unicode
有一种方法:SCardListReaders 在MSDN上有一个例子 在这通电话之后:C++ 仔细检查我的知识:Unicode,c++,C++,有一种方法:SCardListReaders 在MSDN上有一个例子 在这通电话之后: LPTSTR pmszReaders = NULL; LPTSTR pReader; lReturn = SCardListReaders(hSC, NULL, (LPTSTR)&pmszReaders,
LPTSTR pmszReaders = NULL;
LPTSTR pReader;
lReturn = SCardListReaders(hSC,
NULL,
(LPTSTR)&pmszReaders,
&cch );
存在这样的代码,它从多字符串pmszReaders
中提取字符串(多字符串以双空字符结尾)
我的问题是。我认为上面的代码只适用于Unicode,对吗?若我在我的项目中禁用Unicode支持,我认为上面的代码片段将无法正确提取阅读器名称?不是吗
例如,当我选中
wcslen
时,设置Unicode时返回22,未设置Unicode时返回24。如果希望函数在Unicode或MBCS构建中工作,请使用Microsoft特定的\u tcslen
而不是wcslen
如果有人试图在没有Unicode的情况下使用函数,您希望出现编译时错误,请将
LPTSTR
更改为LPWSTRHi Mark,是的,这就是我所理解的,我可能必须将wcslen
替换为\tcslen
,并将wchar\t*
转换为TCHAR*
,对吗?所以我的假设是正确的,确实上面的代码只适用于Unicode,对吗?@user2568508,如果你做得正确,那么转换到wchar\t*
应该是不必要的。是的,您使用wcslen
的原始代码只能在Unicode(UTF-16)上工作。嗯。。好的,一开始我有点惊讶,因为它是来自MSDN的样本,但无论如何还是要感谢。@delnan,Microsoft将UTF-16称为Unicode,所以很难指责某人使用了相同的术语。我真希望他们从来没有那样做过。@MarkRansom我知道(我也和你一样不高兴)。但因为我怀疑OP还不知道,所以我想最好能引起大家的注意。@delnan:delnan谢谢你的回答,尽管我不太明白你的意思。至少现在这个问题已经解决了,就像我刚才问的那样。@user2568508我的意思是,你和微软所谓的“Unicode”只是一种特定的Unicode编码,称为UTF-16。由于还有其他几种Unicode编码,所以更准确地说是“UTF-16”,更重要的是,如果您想支持Unicode应该支持的许多语言,记住UTF-16的局限性是绝对重要的。
pReader = pmszReaders;
while ( '\0' != *pReader )
{
// Display the value.
printf("Reader: %S\n", pReader );
// Advance to the next value.
pReader = pReader + wcslen((wchar_t *)pReader) + 1;
}