多字节环境上 TCHAR[2] 的 sizeof 有关问题

多字节环境下 TCHAR[2] 的 sizeof 问题
非 Unicode 编译环境,碰到有个有意思的问题,在一段程序代码中这样的代码:
C/C++ code

TCHAR szString[2] = {0};
UINT uLength1 = sizeof(szString) / sizeof(TCHAR);    //这里 uLength1 = 2, 结果是正确的



但是如果调用个函数,比如另外写个函数
C/C++ code

xxx::ReadString(LPTSTR lpszText, UINT uMax)
{
    UINT uLength2 = sizeof(lpszText) / sizeof(TCHAR);    //这里问题
}




//如果把第一段代码的 szString 作为参数传递进来,比如这样:
C/C++ code

xxx::ReadString(szString, 2);


就会惊奇的发现 uLength2 = 4 !太神奇了


这是什么原因呢?

------解决方案--------------------
非 Unicode 编译环境下,TCHAR==char 占1个字节,LPTSTR是个指针占4个字节。
------解决方案--------------------
参数是指针,sizeof会判断为指针大小。数组为元素个数乘以元素大小
------解决方案--------------------
你就光给个指针是没办法的,再多给个参数表示长度吧
------解决方案--------------------
xxx::ReadString(LPTSTR lpszText, UINT uMax)
{
UINT uLength2 = sizeof(lpszText) / sizeof(TCHAR); //这里问题
}

TCHAR szString[2] = {0};

LPTSTR lpszText = szString

sizeof(szString) == 2;
sizeof(lpszText) == 4;

之所以不同,是因为sizeof会测试类型,
szString会被测试成数组类型,返回的是。元素个数*每个元素类型的字节数。
所以sizeof。所以sizeof的结果为2,sizeof(THCAR)为1. 结果为2,是正确的。代表有两个TCHAR,每个TCHAR占据1个字节。

而lpszText 则被测试为纯粹的指针。sizeof返回的指针本身所占据的字节数,不管这个指针指向任何类型的数据,指针类型本身的大小是4个字节。所以你才会得到4.

如果你要得到传入参数的大小, 
UINT uLength2 = _tcslen(lpszText) * sizeof(TCHAR);
------解决方案--------------------
如果是这样,我建议你使用_bstr_t也就是BSTR类型来传参,_bstr_t有个属性长度length。即使字符串内容全是\0也能够正确记录长度。