我一直在互联网上搜索这个问题,这对我来说似乎很奇怪。 在我的程序中,我通过以下代码获取计算机的名称:
TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
memset( ComputerName, 0, sizeof( ComputerName ) );
DWORD dwNameLenght = MAX_COMPUTERNAME_LENGTH;
GetComputerNameW(ComputerName, &dwNameLenght);
我已经使用包含unicode字符的计算机名称(ÆÆØ
)对其进行了测试,但它工作正常(尽管GetLastError()
返回的代码为203)。
如果名称为DESKTOP-IVHSIQD
,则不会获得计算机名称,GetLastError()
将返回111,这称为缓冲区溢出。
操作系统是Windows 10 x64。
答案 0 :(得分:4)
我认为你的缓冲区确实太小了...... GetComputerNameW
上的文档指出:
lpnSize [in,out] - 输入时,在TCHAR中指定缓冲区的大小。在输出时,复制到目标缓冲区的TCHAR数,不包括终止空字符。 lpnSize参数指定所需缓冲区的大小,包括终止空字符。
对我而言,这意味着缓冲区本身及其在lpnSize
中的大小应该足以容纳尽可能长的计算机名称和尾随\0
。
您的缓冲区大小为MAX_COMPUTERNAME_LENGTH + 1
(根据文档可以很好),但dwNameLenght
的值小于1个字符。 DESKTOP-IVHSIQD
似乎也只是MAX_COMPUTERNAME_LENGTH
长(15个字符),所以我想说当\0
被附加到缓冲区时会发生溢出。将dwNameLenght
设置为MAX_COMPUTERNAME_LENGTH + 1
可能会解决您的问题。