GetUserNameEx() 返回的缓冲区大小
Posted
技术标签:
【中文标题】GetUserNameEx() 返回的缓冲区大小【英文标题】:Size for the buffer which GetUserNameEx() returns 【发布时间】:2012-02-13 12:01:01 【问题描述】:我有一个关于调用 GetUserNameEx() 时返回大小奇怪的问题。也许有人已经遇到过这个问题。
我调用 GetUserNameEx() 两次:第一次获得所需的缓冲区大小,第二次实际填充缓冲区。
在documentation你可以读到这个关于size参数的内容:
如果 lpNameBuffer 太小,函数会失败,GetLastError 返回 ERROR_MORE_DATA。此参数接收所需的缓冲区大小,以 Unicode 字符(无论是否使用 Unicode),包括终止空字符。
我保存此值 (required_size
) 以检查成功返回的值。
在输入时,此变量指定 lpNameBuffer 缓冲区的大小,以 TCHAR 为单位。如果函数成功,则变量接收复制到缓冲区的 TCHAR 数,不包括终止空字符。
这个是returned_size
。
奇怪的是,如果我将项目属性中的字符编码设置为未设置,那么required_size
是 22,returned_size
是 11。
当我将字符编码设置为使用 Unicode 字符集时,required_size
是 11,returned_size
也是 11。
也许我没有得到什么,但我希望required_size
不会改变。有人看过这个吗?
谢谢。
UPD:这里是code example。
【问题讨论】:
发布您的代码。会更容易看到问题。 用代码链接更新了帖子。 【参考方案1】:我复制。嗯,这是一个错误。它永远不会出错,因为它要求的缓冲区是所需大小的两倍。您将在第二次调用时获得复制到缓冲区的实际字符数,因此您确实知道字符串的实际大小。我不会尝试修复它,在将字符串从 Unicode 转换为 mbcs 之前,它实际上使用缓冲区的可能性很小。虽然我没有看到任何证据。
【讨论】:
确实如此。不要让 Raymond 再次拉出他的 AppCompat 胫骨。如果在一个 Windows 版本上有一个代码路径实际上需要超大缓冲区,那么您最好在您的操作系统版本上提供它,即使在您的特定测试用例中实际上不需要它。以上是关于GetUserNameEx() 返回的缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章
InnoDB 缓冲池大小占总 RAM 的百分比 - (总 RAM 的缓冲池大小)返回无数据